diff options
| author | Dan Engelbrecht <[email protected]> | 2026-03-20 13:44:00 +0100 |
|---|---|---|
| committer | GitHub Enterprise <[email protected]> | 2026-03-20 13:44:00 +0100 |
| commit | 7cc4b1701aa2923573adabceed486229abba5a2d (patch) | |
| tree | 04a1b5eddcabd24e5c5a50a817fa50c5829972f2 /src/zenserver/hub/httphubservice.cpp | |
| parent | Zs/consul token (#870) (diff) | |
| download | zen-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.cpp | 47 |
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()); } |