diff options
Diffstat (limited to 'src/zenserver/zenserver.cpp')
| -rw-r--r-- | src/zenserver/zenserver.cpp | 48 |
1 files changed, 42 insertions, 6 deletions
diff --git a/src/zenserver/zenserver.cpp b/src/zenserver/zenserver.cpp index fe6a5a572..087b40d6a 100644 --- a/src/zenserver/zenserver.cpp +++ b/src/zenserver/zenserver.cpp @@ -272,6 +272,8 @@ ZenServerBase::GetBuildOptions(StringBuilderBase& OutOptions, char Separator) co OutOptions << Separator; OutOptions << "ZEN_WITH_MEMTRACK=" << (ZEN_WITH_MEMTRACK ? "1" : "0"); OutOptions << Separator; + OutOptions << "ZEN_WITH_COMPUTE_SERVICES=" << (ZEN_WITH_COMPUTE_SERVICES ? "1" : "0"); + OutOptions << Separator; OutOptions << "ZEN_WITH_TRACE=" << (ZEN_WITH_TRACE ? "1" : "0"); } @@ -467,6 +469,15 @@ ZenServerBase::HandleStatusRequest(HttpServerRequest& Request) Cbo << "hostname" << GetMachineName(); Cbo << "cpuUsagePercent" << Metrics.CpuUsagePercent; Cbo << "serverMode" << std::string_view(m_ServerMode); + + std::vector<std::string> IpAddresses = GetLocalIpAddresses(); + Cbo.BeginArray("ipAddresses"sv); + for (const std::string& Ip : IpAddresses) + { + Cbo << Ip; + } + Cbo.EndArray(); + Request.WriteResponse(HttpResponseCode::OK, Cbo.Save()); } @@ -479,9 +490,10 @@ ZenServerBase::BuildSettingsList(const ZenServerConfig& ServerConfig) {"ContentDir"sv, fmt::format("{}", ServerConfig.ContentDir)}, {"BasePort"sv, fmt::to_string(ServerConfig.BasePort)}, {"CoreLimit"sv, fmt::to_string(ServerConfig.CoreLimit)}, + {"MemoryAllocator"sv, std::string(GMalloc->GetName())}, + {"AsioVersion"sv, fmt::format("{}.{}.{}", ASIO_VERSION / 100000, (ASIO_VERSION / 100) % 1000, ASIO_VERSION % 100)}, {"IsDebug"sv, fmt::to_string(ServerConfig.IsDebug)}, {"IsCleanStart"sv, fmt::to_string(ServerConfig.IsCleanStart)}, - {"IsPowerCycle"sv, fmt::to_string(ServerConfig.IsPowerCycle)}, {"IsTest"sv, fmt::to_string(ServerConfig.IsTest)}, {"Detach"sv, fmt::to_string(ServerConfig.Detach)}, {"NoConsoleOutput"sv, fmt::to_string(ServerConfig.LoggingConfig.NoConsoleOutput)}, @@ -684,11 +696,33 @@ ZenServerMain::Run() } else { - ZEN_CONSOLE_WARN(ZEN_APP_NAME " exiting, failed to add sponsor owner pid {} to process listening to port {} (pid: {})", - m_ServerOptions.OwnerPid, - m_ServerOptions.BasePort, - Entry->Pid.load()); - std::exit(1); + // The entry's process failed to pick up our sponsor request after + // multiple attempts. Before reclaiming the entry, verify that the + // PID does not still belong to a zenserver process. If it does, the + // server is alive but unresponsive – fall back to the original error + // path. If the PID is gone or belongs to a different executable the + // entry is genuinely stale and safe to reclaim. + const int StalePid = Entry->Pid.load(); + std::error_code ExeEc; + std::filesystem::path PidExePath = GetProcessExecutablePath(StalePid, ExeEc); + const bool PidIsZenServer = !ExeEc && (PidExePath.filename() == GetRunningExecutablePath().filename()); + if (PidIsZenServer) + { + ZEN_CONSOLE_WARN(ZEN_APP_NAME + " exiting, failed to add sponsor to process on port {} " + "(pid {}); that pid is still a running zenserver instance", + m_ServerOptions.BasePort, + StalePid); + std::exit(1); + } + ZEN_CONSOLE_WARN( + "Failed to add sponsor to process on port {} (pid {}); " + "pid belongs to '{}' – assuming stale entry and reclaiming", + m_ServerOptions.BasePort, + StalePid, + ExeEc ? "<unknown>" : PidExePath.filename().string()); + Entry->Reset(); + Entry = nullptr; } } else @@ -739,6 +773,8 @@ ZenServerMain::Run() ZEN_INFO(ZEN_APP_NAME " - using lock file at '{}'", LockFilePath); ZEN_INFO(ZEN_APP_NAME " - starting on port {}, version '{}'", m_ServerOptions.BasePort, ZEN_CFG_VERSION_BUILD_STRING_FULL); + ZEN_INFO(ZEN_APP_NAME " - memory allocator: {}", GMalloc->GetName()); + ZEN_INFO(ZEN_APP_NAME " - asio: {}.{}.{}", ASIO_VERSION / 100000, (ASIO_VERSION / 100) % 1000, ASIO_VERSION % 100); Entry = ServerState.Register(m_ServerOptions.BasePort); |