diff options
Diffstat (limited to 'src/zenserver/hub/storageserverinstance.h')
| -rw-r--r-- | src/zenserver/hub/storageserverinstance.h | 103 |
1 files changed, 37 insertions, 66 deletions
diff --git a/src/zenserver/hub/storageserverinstance.h b/src/zenserver/hub/storageserverinstance.h index a0ca496dc..c5917afc9 100644 --- a/src/zenserver/hub/storageserverinstance.h +++ b/src/zenserver/hub/storageserverinstance.h @@ -2,9 +2,9 @@ #pragma once -#include "hubinstancestate.h" -#include "resourcemetrics.h" +#include "hydration.h" +#include <zencore/compactbinary.h> #include <zenutil/zenserverprocess.h> #include <atomic> @@ -12,6 +12,8 @@ namespace zen { +class WorkerThreadPool; + /** * Storage Server Instance * @@ -25,22 +27,28 @@ public: struct Configuration { uint16_t BasePort; - std::filesystem::path HydrationTempPath; - std::string HydrationTargetSpecification; + std::filesystem::path StateDir; + std::filesystem::path TempDir; uint32_t HttpThreadCount = 0; // Automatic int CoreLimit = 0; // Automatic std::filesystem::path ConfigPath; + std::string Malloc; + std::string Trace; + std::string TraceHost; + std::string TraceFile; + + WorkerThreadPool* OptionalWorkerPool = nullptr; }; - StorageServerInstance(ZenServerEnvironment& RunEnvironment, const Configuration& Config, std::string_view ModuleId); + StorageServerInstance(ZenServerEnvironment& RunEnvironment, + HydrationBase& Hydration, + const Configuration& Config, + std::string_view ModuleId); ~StorageServerInstance(); - const ResourceMetrics& GetResourceMetrics() const { return m_ResourceMetrics; } - inline std::string_view GetModuleId() const { return m_ModuleId; } - inline HubInstanceState GetState() const { return m_State.load(); } - inline uint16_t GetBasePort() const { return m_Config.BasePort; }; - void GetProcessMetrics(ProcessMetrics& OutMetrics) const; + inline uint16_t GetBasePort() const { return m_Config.BasePort; } + ProcessMetrics GetProcessMetrics() const; #if ZEN_PLATFORM_WINDOWS void SetJobObject(JobObject* InJobObject) { m_JobObject = InJobObject; } @@ -63,27 +71,17 @@ public: operator bool() const { return m_Instance != nullptr; } std::string_view GetModuleId() const; - HubInstanceState GetState() const - { - ZEN_ASSERT(m_Instance); - return m_Instance->m_State.load(); - } - uint16_t GetBasePort() const + uint16_t GetBasePort() const { ZEN_ASSERT(m_Instance); return m_Instance->GetBasePort(); } bool IsRunning() const; - const ResourceMetrics& GetResourceMetrics() const + ProcessMetrics GetProcessMetrics() const { ZEN_ASSERT(m_Instance); - return m_Instance->m_ResourceMetrics; - } - void UpdateMetrics() - { - ZEN_ASSERT(m_Instance); - return m_Instance->UpdateMetricsLocked(); + return m_Instance->GetProcessMetrics(); } #if ZEN_WITH_TESTS @@ -114,33 +112,18 @@ public: operator bool() const { return m_Instance != nullptr; } std::string_view GetModuleId() const; - HubInstanceState GetState() const - { - ZEN_ASSERT(m_Instance); - return m_Instance->m_State.load(); - } - uint16_t GetBasePort() const + uint16_t GetBasePort() const { ZEN_ASSERT(m_Instance); return m_Instance->GetBasePort(); } bool IsRunning() const; - const ResourceMetrics& GetResourceMetrics() const - { - ZEN_ASSERT(m_Instance); - return m_Instance->m_ResourceMetrics; - } - - // For Provision, Deprovision, Hibernate, Wake: - // true = operation performed (state changed) - // false = precondition not met (wrong state), nothing attempted - // throws = operation attempted but failed; m_State corrected before throw - [[nodiscard]] bool Provision(); - [[nodiscard]] bool Deprovision(); - [[nodiscard]] bool Hibernate(); - [[nodiscard]] bool Wake(); - [[nodiscard]] bool RecoverFromCrash(); // true = recovered; false = spawn failed (Crashed), caller must Deprovision() + cleanup + void Provision(); + void Deprovision(); + void Obliterate(); + void Hibernate(); + void Wake(); private: RwLock* m_Lock = nullptr; @@ -150,33 +133,20 @@ public: [[nodiscard]] ExclusiveLockedPtr LockExclusive(bool Wait) { return ExclusiveLockedPtr(m_Lock, this, Wait); } private: - [[nodiscard]] bool ProvisionLocked(); - [[nodiscard]] bool DeprovisionLocked(); - - [[nodiscard]] bool HibernateLocked(); - [[nodiscard]] bool WakeLocked(); - [[nodiscard]] bool RecoverCrashedLocked(); // true = recovered (Provisioned); false = spawn failed (Crashed) + void ProvisionLocked(); + void DeprovisionLocked(); + void ObliterateLocked(); - void UpdateMetricsLocked(); + void HibernateLocked(); + void WakeLocked(); mutable RwLock m_Lock; + HydrationBase& m_Hydration; const Configuration m_Config; std::string m_ModuleId; ZenServerInstance m_ServerInstance; - std::atomic<HubInstanceState> m_State{HubInstanceState::Unprovisioned}; - std::filesystem::path m_BaseDir; - - std::filesystem::path m_TempDir; - ResourceMetrics m_ResourceMetrics; - - std::atomic<uint64_t> m_MemoryBytes = 0; - std::atomic<uint64_t> m_KernelTimeMs = 0; - std::atomic<uint64_t> m_UserTimeMs = 0; - std::atomic<uint64_t> m_WorkingSetSize = 0; - std::atomic<uint64_t> m_PeakWorkingSetSize = 0; - std::atomic<uint64_t> m_PagefileUsage = 0; - std::atomic<uint64_t> m_PeakPagefileUsage = 0; + CbObject m_HydrationState; #if ZEN_PLATFORM_WINDOWS JobObject* m_JobObject = nullptr; @@ -184,8 +154,9 @@ private: void SpawnServerProcess(); - void Hydrate(); - void Dehydrate(); + void Hydrate(); + void Dehydrate(); + HydrationConfig MakeHydrationConfig(std::atomic<bool>& AbortFlag, std::atomic<bool>& PauseFlag); friend class SharedLockedPtr; friend class ExclusiveLockedPtr; |