Loading src/admin.cpp +8 −14 Original line number Diff line number Diff line Loading @@ -1872,20 +1872,14 @@ namespace authdb { // Vacuum cluster block stores when cluster mode is active if (g_Cluster && g_Cluster->isRunning()) { auto &pclient = g_Cluster->getClient(); if (pclient) { size_t nodes_ok = 0; try { nodes_ok = pclient->vacuum_all_nodes(); nodes_ok = g_Cluster->vacuumAllNodes(); } catch (...) {} json_object_object_add(jobj, "cluster_vacuum", json_object_new_boolean(true)); json_object_object_add(jobj, "cluster_nodes_vacuumed", json_object_new_int64(static_cast<int64_t>(nodes_ok))); } else { json_object_object_add(jobj, "cluster_vacuum", json_object_new_boolean(false)); } } sendJson(curreq, jobj); Loading src/cluster.cpp +22 −0 Original line number Diff line number Diff line Loading @@ -1130,6 +1130,28 @@ namespace authdb { return true; } // --- Vacuum: compact block stores on all nodes (cluster-locked) --- size_t Cluster::vacuumAllNodes() { if (!scrub_client_) return 0; std::unique_lock<std::mutex> scrub_lk(scrub_mutex_, std::try_to_lock); if (!scrub_lk.owns_lock()) { std::cerr << "[VACUUM] skipped — scrub/rebalance is running" << std::endl; return 0; } if (!scrub_client_->try_scrub_lock()) { std::cerr << "[VACUUM] skipped — another node holds the scrub lock" << std::endl; return 0; } size_t result = scrub_client_->vacuum_all_nodes(); scrub_client_->release_scrub_lock(); return result; } // --- Scrub: verify and repair all data groups --- Cluster::ScrubResult Cluster::scrub() { Loading src/cluster.h +3 −0 Original line number Diff line number Diff line Loading @@ -161,6 +161,9 @@ namespace authdb { std::unique_ptr<paritypp::client> &getReadClient() { return read_client_; } std::unique_ptr<paritypp::client> &getSessionReadClient() { return session_read_client_; } // Vacuum all cluster nodes (acquires cluster-wide scrub lock) size_t vacuumAllNodes(); // Push a session to the cluster (after local addSession) void pushSession(const SessionData &sess); Loading Loading
src/admin.cpp +8 −14 Original line number Diff line number Diff line Loading @@ -1872,20 +1872,14 @@ namespace authdb { // Vacuum cluster block stores when cluster mode is active if (g_Cluster && g_Cluster->isRunning()) { auto &pclient = g_Cluster->getClient(); if (pclient) { size_t nodes_ok = 0; try { nodes_ok = pclient->vacuum_all_nodes(); nodes_ok = g_Cluster->vacuumAllNodes(); } catch (...) {} json_object_object_add(jobj, "cluster_vacuum", json_object_new_boolean(true)); json_object_object_add(jobj, "cluster_nodes_vacuumed", json_object_new_int64(static_cast<int64_t>(nodes_ok))); } else { json_object_object_add(jobj, "cluster_vacuum", json_object_new_boolean(false)); } } sendJson(curreq, jobj); Loading
src/cluster.cpp +22 −0 Original line number Diff line number Diff line Loading @@ -1130,6 +1130,28 @@ namespace authdb { return true; } // --- Vacuum: compact block stores on all nodes (cluster-locked) --- size_t Cluster::vacuumAllNodes() { if (!scrub_client_) return 0; std::unique_lock<std::mutex> scrub_lk(scrub_mutex_, std::try_to_lock); if (!scrub_lk.owns_lock()) { std::cerr << "[VACUUM] skipped — scrub/rebalance is running" << std::endl; return 0; } if (!scrub_client_->try_scrub_lock()) { std::cerr << "[VACUUM] skipped — another node holds the scrub lock" << std::endl; return 0; } size_t result = scrub_client_->vacuum_all_nodes(); scrub_client_->release_scrub_lock(); return result; } // --- Scrub: verify and repair all data groups --- Cluster::ScrubResult Cluster::scrub() { Loading
src/cluster.h +3 −0 Original line number Diff line number Diff line Loading @@ -161,6 +161,9 @@ namespace authdb { std::unique_ptr<paritypp::client> &getReadClient() { return read_client_; } std::unique_ptr<paritypp::client> &getSessionReadClient() { return session_read_client_; } // Vacuum all cluster nodes (acquires cluster-wide scrub lock) size_t vacuumAllNodes(); // Push a session to the cluster (after local addSession) void pushSession(const SessionData &sess); Loading