From d0d40b36b306236428a764349dbff98d38cf7dbd Mon Sep 17 00:00:00 2001 From: Dan Engelbrecht Date: Tue, 17 Mar 2026 22:57:20 +0100 Subject: zen hub port reuse (#850) - Feature: Added `--allow-port-probing` option to control whether zenserver searches for a free port on startup (default: true, automatically false when --dedicated is set) - Feature: Added new hub options for controlling provisioned storage server instances: - `--hub-instance-http` - HTTP server implementation for instances (asio/httpsys) - `--hub-instance-http-threads` - Number of HTTP connection threads per instance - `--hub-instance-corelimit` - Limit CPU concurrency per instance - Improvement: Hub now manages a deterministic port pool for provisioned instances allowing reuse of unused ports --- src/zenserver/hub/storageserverinstance.cpp | 30 ++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) (limited to 'src/zenserver/hub/storageserverinstance.cpp') diff --git a/src/zenserver/hub/storageserverinstance.cpp b/src/zenserver/hub/storageserverinstance.cpp index f24379715..68de5e274 100644 --- a/src/zenserver/hub/storageserverinstance.cpp +++ b/src/zenserver/hub/storageserverinstance.cpp @@ -11,16 +11,13 @@ namespace zen { -StorageServerInstance::StorageServerInstance(ZenServerEnvironment& RunEnvironment, - std::string_view ModuleId, - std::filesystem::path FileHydrationPath, - std::filesystem::path HydrationTempPath) -: m_ModuleId(ModuleId) +StorageServerInstance::StorageServerInstance(ZenServerEnvironment& RunEnvironment, const Configuration& Config, std::string_view ModuleId) +: m_Config(Config) +, m_ModuleId(ModuleId) , m_ServerInstance(RunEnvironment, ZenServerInstance::ServerMode::kStorageServer) -, m_HydrationPath(FileHydrationPath) { m_BaseDir = RunEnvironment.CreateChildDir(ModuleId); - m_TempDir = HydrationTempPath / ModuleId; + m_TempDir = Config.HydrationTempPath / ModuleId; } StorageServerInstance::~StorageServerInstance() @@ -37,9 +34,20 @@ StorageServerInstance::SpawnServerProcess() #if ZEN_PLATFORM_WINDOWS m_ServerInstance.SetJobObject(m_JobObject); #endif - const uint16_t BasePort = m_ServerInstance.SpawnServerAndWaitUntilReady(); - ZEN_DEBUG("Storage server instance for module '{}' started, listening on port {}", m_ModuleId, BasePort); + ExtendableStringBuilder<256> AdditionalOptions; + AdditionalOptions << "--allow-port-probing=false"; + if (m_Config.HttpThreadCount != 0) + { + AdditionalOptions << " --http-threads=" << m_Config.HttpThreadCount; + } + if (m_Config.CoreLimit != 0) + { + AdditionalOptions << " --corelimit=" << m_Config.CoreLimit; + } + + m_ServerInstance.SpawnServerAndWaitUntilReady(m_Config.BasePort, AdditionalOptions.ToView()); + ZEN_DEBUG("Storage server instance for module '{}' started, listening on port {}", m_ModuleId, m_Config.BasePort); m_ServerInstance.EnableShutdownOnDestroy(); } @@ -178,7 +186,7 @@ StorageServerInstance::Hydrate() HydrationConfig Config{.ServerStateDir = m_BaseDir, .TempDir = m_TempDir, .ModuleId = m_ModuleId, - .TargetSpecification = WideToUtf8(m_HydrationPath.native())}; + .TargetSpecification = WideToUtf8(m_Config.FileHydrationPath.native())}; std::unique_ptr Hydrator = CreateFileHydrator(); @@ -192,7 +200,7 @@ StorageServerInstance::Dehydrate() HydrationConfig Config{.ServerStateDir = m_BaseDir, .TempDir = m_TempDir, .ModuleId = m_ModuleId, - .TargetSpecification = WideToUtf8(m_HydrationPath.native())}; + .TargetSpecification = WideToUtf8(m_Config.FileHydrationPath.native())}; std::unique_ptr Hydrator = CreateFileHydrator(); -- cgit v1.2.3