diff options
Diffstat (limited to 'src/zenserver/hub/hub.h')
| -rw-r--r-- | src/zenserver/hub/hub.h | 55 |
1 files changed, 48 insertions, 7 deletions
diff --git a/src/zenserver/hub/hub.h b/src/zenserver/hub/hub.h index f880dab52..28e77e729 100644 --- a/src/zenserver/hub/hub.h +++ b/src/zenserver/hub/hub.h @@ -53,12 +53,13 @@ public: std::string HydrationTargetSpecification; }; - typedef std::function<void(std::string_view ModuleId, const HubProvisionedInstanceInfo& Info)> ProvisionModuleCallbackFunc; + typedef std::function< + void(std::string_view ModuleId, const HubProvisionedInstanceInfo& Info, HubInstanceState OldState, HubInstanceState NewState)> + AsyncModuleStateChangeCallbackFunc; - Hub(const Configuration& Config, - ZenServerEnvironment&& RunEnvironment, - ProvisionModuleCallbackFunc&& ProvisionedModuleCallback = {}, - ProvisionModuleCallbackFunc&& DeprovisionedModuleCallback = {}); + Hub(const Configuration& Config, + ZenServerEnvironment&& RunEnvironment, + AsyncModuleStateChangeCallbackFunc&& ModuleStateChangeCallback = {}); ~Hub(); Hub(const Hub&) = delete; @@ -73,6 +74,11 @@ public: }; /** + * Deprovision all running instances + */ + void Shutdown(); + + /** * Provision a storage server instance for the given module ID. * * @param ModuleId The ID of the module to provision. @@ -139,8 +145,7 @@ private: const Configuration m_Config; ZenServerEnvironment m_RunEnvironment; - ProvisionModuleCallbackFunc m_ProvisionedModuleCallback; - ProvisionModuleCallbackFunc m_DeprovisionedModuleCallback; + AsyncModuleStateChangeCallbackFunc m_ModuleStateChangeCallback; std::string m_HydrationTargetSpecification; std::filesystem::path m_HydrationTempPath; @@ -170,6 +175,42 @@ private: void UpdateStats(); void UpdateCapacityMetrics(); bool CanProvisionInstance(std::string_view ModuleId, std::string& OutReason); + + class InstanceStateUpdateGuard + { + public: + InstanceStateUpdateGuard(Hub& InHub, + std::string_view ModuleId, + HubInstanceState OldState, + HubInstanceState& NewState, + uint16_t BasePort, + const std::string& BaseUri) + : m_Hub(InHub) + , m_ModuleId(ModuleId) + , m_OldState(OldState) + , m_NewState(NewState) + , m_BasePort(BasePort) + , m_BaseUri(BaseUri) + { + } + ~InstanceStateUpdateGuard() { m_Hub.OnStateUpdate(m_ModuleId, m_OldState, m_NewState, m_BasePort, m_BaseUri); } + + private: + Hub& m_Hub; + const std::string m_ModuleId; + HubInstanceState m_OldState; + HubInstanceState& m_NewState; + uint16_t m_BasePort; + const std::string m_BaseUri; + }; + + void OnStateUpdate(std::string_view ModuleId, + HubInstanceState OldState, + HubInstanceState& NewState, + uint16_t BasePort, + std::string_view BaseUri); + + friend class InstanceStateUpdateGuard; }; #if ZEN_WITH_TESTS |