aboutsummaryrefslogtreecommitdiff
path: root/src/zenserver/hub/httphubservice.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2026-03-20 13:44:00 +0100
committerGitHub Enterprise <[email protected]>2026-03-20 13:44:00 +0100
commit7cc4b1701aa2923573adabceed486229abba5a2d (patch)
tree04a1b5eddcabd24e5c5a50a817fa50c5829972f2 /src/zenserver/hub/httphubservice.cpp
parentZs/consul token (#870) (diff)
downloadzen-7cc4b1701aa2923573adabceed486229abba5a2d.tar.xz
zen-7cc4b1701aa2923573adabceed486229abba5a2d.zip
add hub instance info (#869)
- Improvement: Hub module listing now includes per-instance process metrics (memory, CPU time, working set, pagefile usage) - Improvement: Hub now monitors provisioned instance health in the background and refreshes process metrics periodically - Improvement: Hub no longer exposes raw `StorageServerInstance` pointers to callers; instance state is returned as value snapshots (`Hub::InstanceInfo`) - Improvement: Hub instance access is now guarded by RAII per-instance locks (`SharedLockedPtr`/`ExclusiveLockedPtr`), preventing concurrent modifications during provisioning and deprovisioning - Improvement: Hub instance lifecycle is now tracked as a `HubInstanceState` enum covering transitional states (Provisioning, Deprovisioning, Hibernating, Waking); exposed as a string in the HTTP API and dashboard
Diffstat (limited to 'src/zenserver/hub/httphubservice.cpp')
-rw-r--r--src/zenserver/hub/httphubservice.cpp47
1 files changed, 35 insertions, 12 deletions
diff --git a/src/zenserver/hub/httphubservice.cpp b/src/zenserver/hub/httphubservice.cpp
index 67ed0cfd8..5497bcf2b 100644
--- a/src/zenserver/hub/httphubservice.cpp
+++ b/src/zenserver/hub/httphubservice.cpp
@@ -37,10 +37,23 @@ HttpHubService::HttpHubService(Hub& Hub) : m_Hub(Hub)
[this](HttpRouterRequest& Req) {
CbObjectWriter Obj;
Obj.BeginArray("modules");
- m_Hub.EnumerateModules([&Obj](StorageServerInstance& Instance) {
+ m_Hub.EnumerateModules([&Obj](std::string_view ModuleId, const Hub::InstanceInfo& Info) {
Obj.BeginObject();
- Obj << "moduleId" << Instance.GetModuleId();
- Obj << "provisioned" << Instance.IsProvisioned();
+ {
+ Obj << "moduleId" << ModuleId;
+ Obj << "state" << ToString(Info.State);
+ Obj.BeginObject("process_metrics");
+ {
+ Obj << "MemoryBytes" << Info.Metrics.MemoryBytes;
+ Obj << "KernelTimeMs" << Info.Metrics.KernelTimeMs;
+ Obj << "UserTimeMs" << Info.Metrics.UserTimeMs;
+ Obj << "WorkingSetSize" << Info.Metrics.WorkingSetSize;
+ Obj << "PeakWorkingSetSize" << Info.Metrics.PeakWorkingSetSize;
+ Obj << "PagefileUsage" << Info.Metrics.PagefileUsage;
+ Obj << "PeakPagefileUsage" << Info.Metrics.PeakPagefileUsage;
+ }
+ Obj.EndObject();
+ }
Obj.EndObject();
});
Obj.EndArray();
@@ -176,8 +189,8 @@ HttpHubService::HandleRequest(zen::HttpServerRequest& Request)
void
HttpHubService::HandleModuleGet(HttpServerRequest& Request, std::string_view ModuleId)
{
- StorageServerInstance* Instance = nullptr;
- if (!m_Hub.Find(ModuleId, &Instance))
+ Hub::InstanceInfo InstanceInfo;
+ if (!m_Hub.Find(ModuleId, &InstanceInfo))
{
Request.WriteResponse(HttpResponseCode::NotFound);
return;
@@ -187,26 +200,36 @@ HttpHubService::HandleModuleGet(HttpServerRequest& Request, std::string_view Mod
// with a dangling pointer...
CbObjectWriter Obj;
- Obj << "moduleId" << Instance->GetModuleId();
- Obj << "provisioned" << Instance->IsProvisioned();
+ Obj << "moduleId" << ModuleId;
+ Obj << "state" << ToString(InstanceInfo.State);
Request.WriteResponse(HttpResponseCode::OK, Obj.Save());
}
void
HttpHubService::HandleModuleDelete(HttpServerRequest& Request, std::string_view ModuleId)
{
- StorageServerInstance* Instance = nullptr;
- if (!m_Hub.Find(ModuleId, &Instance))
+ Hub::InstanceInfo InstanceInfo;
+ if (!m_Hub.Find(ModuleId, &InstanceInfo))
{
Request.WriteResponse(HttpResponseCode::NotFound);
return;
}
- // TODO: deprovision and nuke all related storage
+ if (InstanceInfo.State == HubInstanceState::Provisioned)
+ {
+ std::string Reason;
+ if (!m_Hub.Deprovision(std::string(ModuleId), Reason))
+ {
+ Request.WriteResponse(HttpResponseCode::InternalServerError, HttpContentType::kText, Reason);
+ return;
+ }
+ }
+
+ // TODO: nuke all related storage
CbObjectWriter Obj;
- Obj << "moduleId" << Instance->GetModuleId();
- Obj << "provisioned" << Instance->IsProvisioned();
+ Obj << "moduleId" << ModuleId;
+ Obj << "state" << ToString(InstanceInfo.State);
Request.WriteResponse(HttpResponseCode::OK, Obj.Save());
}