aboutsummaryrefslogtreecommitdiff
path: root/src/zenserver/hub/storageserverinstance.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/zenserver/hub/storageserverinstance.h')
-rw-r--r--src/zenserver/hub/storageserverinstance.h103
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;