localPackages.hpcstat: bug in deserialize, read from duc directly

This commit is contained in:
2024-06-11 17:45:09 +08:00
parent 92fdc6c67d
commit b46f928964
5 changed files with 28 additions and 46 deletions

View File

@@ -11,6 +11,8 @@ namespace hpcstat::disk
std::string Time;
using serialize = zpp::bits::members<4>;
};
// 刷新 duc 数据库,并读取
std::optional<Usage> stat();
// 刷新 duc 数据库
bool stat();
// 从 duc 数据库中读取数据
std::optional<Usage> get();
}

View File

@@ -68,6 +68,4 @@ namespace hpcstat::sql
// 如果没有找到提交时的信息,则忽略这个任务
std::optional<std::map<unsigned, std::tuple<std::string, std::string, std::string, std::optional<std::string>>>>
check_job_status();
// 获取最新的磁盘使用情况
std::optional<std::string> get_disk();
}

View File

@@ -20,14 +20,14 @@ namespace hpcstat::disk
{ "zhanhuahan", false }
};
std::optional<Usage> stat()
bool stat()
{
if (auto homedir = env::env("HOME"); !homedir)
{ std::cerr << "HOME not set\n"; return {}; }
{ std::cerr << "HOME not set\n"; return false; }
else if (auto ducbindir = env::env("HPCSTAT_DUC_BINDIR"); !ducbindir)
{ std::cerr << "HPCSTAT_DUC_BINDIR not set\n"; return {}; }
{ std::cerr << "HPCSTAT_DUC_BINDIR not set\n"; return false; }
else if (auto datadir = env::env("HPCSTAT_DATADIR"); !datadir)
{ std::cerr << "HPCSTAT_DATADIR not set\n"; return {}; }
{ std::cerr << "HPCSTAT_DATADIR not set\n"; return false; }
else if
(
auto result = biu::exec<{.DirectStdout = true, .DirectStderr = true}>
@@ -38,7 +38,18 @@ namespace hpcstat::disk
);
!result
)
{ std::cerr << "failed to index\n"; return {}; }
{ std::cerr << "failed to index\n"; return false; }
else return true;
}
std::optional<Usage> get()
{
if (auto homedir = env::env("HOME"); !homedir)
{ std::cerr << "HOME not set\n"; return {}; }
else if (auto ducbindir = env::env("HPCSTAT_DUC_BINDIR"); !ducbindir)
{ std::cerr << "HPCSTAT_DUC_BINDIR not set\n"; return {}; }
else if (auto datadir = env::env("HPCSTAT_DATADIR"); !datadir)
{ std::cerr << "HPCSTAT_DATADIR not set\n"; return {}; }
else
{
auto get_size = [&](std::optional<std::string> path) -> std::optional<double>
@@ -87,7 +98,7 @@ namespace hpcstat::disk
{
std::smatch match;
// search string like 2024-06-08 13:45:19
if (!std::regex_search(result.Stdout, match, std::regex(R"((\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}))")))
if (!std::regex_search(result.Stdout, match, R"((\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}))"_re))
{ std::cerr << "failed to parse {}\n"_f(result.Stdout); return {}; }
return match[1];
}

View File

@@ -56,12 +56,11 @@ int main(int argc, const char** argv)
{
std::cout << "\33[2K\rLogged in as {} (Fingerprint: SHA256:{}{}).\n"_f
(Keys[*fp].Username, *fp, sub_account ? " Subaccount {}"_f(*sub_account) : "");
if (auto sql_data = sql::get_disk(); !sql_data)
if (auto disk_stat = disk::get(); !disk_stat)
std::cerr << "Failed to get disk usage statistic.\n";
else
{
auto disk_stat = biu::deserialize<disk::Usage>(*sql_data);
double percent = disk_stat.Total / 800 * 100;
double percent = disk_stat->Total / 800 * 100;
auto color = percent > 95 ? termcolor::red<char> :
percent > 80 ? termcolor::yellow<char> : termcolor::green<char>;
auto bgcolor = percent > 95 ? termcolor::on_red<char> :
@@ -69,15 +68,15 @@ int main(int argc, const char** argv)
std::cout
<< color << "disk usage: " << termcolor::reset
<< bgcolor << termcolor::white
<< "{:.1f}% ({:.1f}GB / ~800GB)"_f(percent, disk_stat.Total) << termcolor::reset
<< color << " (estimated, counted at {})\n"_f(disk_stat.Time) << termcolor::reset;
<< "{:.1f}% ({:.1f}GB / ~800GB)"_f(percent, disk_stat->Total) << termcolor::reset
<< color << " (estimated, counted at {})\n"_f(disk_stat->Time) << termcolor::reset;
if (percent > 80)
{
std::cout << color << "Top 3 directories owned by teacher:\n";
for (auto& [name, size] : disk_stat.Teacher | ranges::views::take(3))
for (auto& [name, size] : disk_stat->Teacher | ranges::views::take(3))
std::cout << " {:.1f}GB {}\n"_f(size, name);
std::cout << color << "Top 3 directories owned by student:\n";
for (auto& [name, size] : disk_stat.Student | ranges::views::take(3))
for (auto& [name, size] : disk_stat->Student | ranges::views::take(3))
std::cout << " {:.1f}GB {}\n"_f(size, name);
std::cout << termcolor::reset;
}
@@ -179,16 +178,7 @@ int main(int argc, const char** argv)
}
else if (args[1] == "version") { std::cout << HPCSTAT_VERSION << std::endl; }
else if (args[1] == "diskstat")
{
if (auto stat = disk::stat(); !stat)
{ std::cerr << "Failed to collect disk usage statistic.\n"; return 1; }
else
{
lock.lock();
if (auto write_result = sql::writedb(sql::DiskData{.Data = biu::serialize<char>(*stat)}); !write_result)
{ std::cerr << "Failed to write disk usage statistic to database.\n"; return 1; }
}
}
{ if (!disk::stat()) { std::cerr << "Failed to collect disk usage statistic.\n"; return 1; } }
else { std::cerr << "Unknown command.\n"; return 1; }
}
catch (...) { std::cerr << boost::current_exception_diagnostic_information() << std::endl; return 1; }

View File

@@ -68,12 +68,6 @@ namespace hpcstat::sql
sqlite_orm::make_column("id", &CheckJobData::Id, sqlite_orm::primary_key().autoincrement()),
sqlite_orm::make_column("job_id", &CheckJobData::JobId),
sqlite_orm::make_column("status", &CheckJobData::Status)
),
sqlite_orm::make_table
(
"disk",
sqlite_orm::make_column("id", &DiskData::Id, sqlite_orm::primary_key().autoincrement()),
sqlite_orm::make_column("data", &DiskData::Data)
)
));};
if (!dbfile)
@@ -98,7 +92,6 @@ namespace hpcstat::sql
template bool writedb(LogoutData);
template bool writedb(SubmitJobData);
template bool writedb(FinishJobData);
template bool writedb(DiskData);
std::optional<std::set<unsigned>> finishjob_remove_existed(std::map<unsigned, std::string> jobid_submit_time)
{
if (auto conn = connect(); !conn) return std::nullopt;
@@ -326,16 +319,4 @@ namespace hpcstat::sql
return result;
}
}
std::optional<std::string> get_disk()
{
if (auto conn = connect(); !conn) return {};
else if
(
auto result =
conn->get_all<DiskData>(sqlite_orm::order_by(&DiskData::Id).desc(), sqlite_orm::limit(1));
result.size() != 1
)
return {};
else return result[0].Data;
}
}