runtime: improve startup observability
Some checks failed
build / Linux asan (push) Has been cancelled
build / Linux release (push) Has been cancelled
build / FreeBSD build (push) Has been cancelled

This commit is contained in:
server
2026-04-14 06:04:12 +02:00
parent 3e3f0918e9
commit 7daf51f2da
3 changed files with 126 additions and 2 deletions

View File

@@ -45,6 +45,43 @@ extern const char * _malloc_options;
extern void WriteVersion(); extern void WriteVersion();
namespace
{
const char* BoolState(bool value)
{
return value ? "on" : "off";
}
const char* EmptyToLabel(const std::string& value, const char* fallback)
{
return value.empty() ? fallback : value.c_str();
}
void LogStartupSummary(int heart_fps, int player_id_start)
{
sys_log(0,
"[STARTUP] locale=%s table_postfix=%s player_db=%s player_id_start=%d heart_fps=%d test_server=%s log=%s hotbackup=%s",
EmptyToLabel(g_stLocale, "<unset>"),
EmptyToLabel(g_stTablePostfix, "<none>"),
EmptyToLabel(g_stPlayerDBName, "<unset>"),
player_id_start,
heart_fps,
BoolState(g_test_server),
BoolState(g_log != 0),
BoolState(g_bHotBackup)
);
sys_log(0,
"[STARTUP] cache_flush player=%d item=%d pricelist=%d logout=%d locale_name_column=%s",
g_iPlayerCacheFlushSeconds,
g_iItemCacheFlushSeconds,
g_iItemPriceListTableCacheFlushSeconds,
g_iLogoutSeconds,
EmptyToLabel(g_stLocaleNameColumn, "<unset>")
);
}
}
void emergency_sig(int sig) void emergency_sig(int sig)
{ {
if (sig == SIGSEGV) if (sig == SIGSEGV)
@@ -374,6 +411,8 @@ int Start()
return false; return false;
} }
LogStartupSummary(heart_beat, iIDStart);
#ifndef OS_WINDOWS #ifndef OS_WINDOWS
signal(SIGUSR1, emergency_sig); signal(SIGUSR1, emergency_sig);
#endif #endif
@@ -409,4 +448,3 @@ const char * GetPlayerDBName()
{ {
return g_stPlayerDBName.c_str(); return g_stPlayerDBName.c_str();
} }

View File

@@ -167,6 +167,64 @@ void ShutdownOnFatalError()
namespace namespace
{ {
const char* BoolState(bool value)
{
return value ? "on" : "off";
}
const char* EmptyToLabel(const char* value, const char* fallback)
{
return (value && *value) ? value : fallback;
}
const char* EmptyToLabel(const std::string& value, const char* fallback)
{
return value.empty() ? fallback : value.c_str();
}
void LogStartupSummary()
{
#ifdef ENABLE_PROXY_IP
const char* proxy_ip = EmptyToLabel(g_stProxyIP, "<disabled>");
#else
const char* proxy_ip = "<disabled>";
#endif
sys_log(0,
"[STARTUP] mode=%s channel=%u bind=%s:%u p2p=%s:%u db=%s:%u locale=%s quest_dir=%s",
g_bAuthServer ? "auth" : "game",
g_bChannel,
EmptyToLabel(g_szPublicIP, "0.0.0.0"), mother_port,
EmptyToLabel(g_szPublicIP, "0.0.0.0"), p2p_port,
EmptyToLabel(db_addr, "<unset>"), db_port,
EmptyToLabel(g_stLocale, "<unset>"),
EmptyToLabel(g_stQuestDir, "<unset>")
);
sys_log(0,
"[STARTUP] users limit=%d full=%d busy=%d local=%u p2p_peers=%d regen=%s admin_page=%s proxy=%s",
g_iUserLimit,
g_iFullUserCount,
g_iBusyUserCount,
DESC_MANAGER::instance().GetLocalUserCount(),
P2P_MANAGER::instance().GetDescCount(),
BoolState(!g_bNoRegen),
BoolState(!g_stAdminPagePassword.empty()),
proxy_ip
);
sys_log(0,
"[STARTUP] features client_version_check=%s guild_mark_server=%s mark_min_level=%u empire_whisper=%s auth_master=%s:%u test_server=%d",
BoolState(g_bCheckClientVersion),
BoolState(guild_mark_server),
guild_mark_min_level,
BoolState(g_bEmpireWhisper),
EmptyToLabel(g_stAuthMasterIP, "<disabled>"),
g_wAuthMasterPort,
test_server
);
}
struct SendDisconnectFunc struct SendDisconnectFunc
{ {
void operator () (LPDESC d) void operator () (LPDESC d)
@@ -594,6 +652,8 @@ int start(int argc, char **argv)
LoadSpamDB(); LoadSpamDB();
} }
LogStartupSummary();
signal_timer_enable(30); signal_timer_enable(30);
return 1; return 1;
} }
@@ -778,4 +838,3 @@ int io_loop(LPFDWATCH fdw)
return 1; return 1;
} }

View File

@@ -10,6 +10,31 @@ void socket_timeout(socket_t s, long sec, long usec);
void socket_reuse(socket_t s); void socket_reuse(socket_t s);
void socket_keepalive(socket_t s); void socket_keepalive(socket_t s);
namespace
{
bool socket_accept_should_retry()
{
#ifdef OS_WINDOWS
const int wsa_error = WSAGetLastError();
return wsa_error == WSAEWOULDBLOCK || wsa_error == WSAEINTR;
#else
#ifdef EINTR
if (errno == EINTR)
return true;
#endif
#ifdef EAGAIN
if (errno == EAGAIN)
return true;
#endif
#ifdef EWOULDBLOCK
if (errno == EWOULDBLOCK)
return true;
#endif
return false;
#endif
}
}
int socket_read(socket_t desc, char* read_point, size_t space_left) int socket_read(socket_t desc, char* read_point, size_t space_left)
{ {
int ret; int ret;
@@ -206,6 +231,8 @@ socket_t socket_accept(socket_t s, struct sockaddr_in *peer)
if ((desc = accept(s, (struct sockaddr *) peer, &i)) == -1) if ((desc = accept(s, (struct sockaddr *) peer, &i)) == -1)
{ {
if (socket_accept_should_retry())
return -1;
sys_err("accept: %s (fd %d)", strerror(errno), s); sys_err("accept: %s (fd %d)", strerror(errno), s);
return -1; return -1;
} }