diff options
Diffstat (limited to 'src/server.c')
-rw-r--r-- | src/server.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/src/server.c b/src/server.c index 6aeb5aa9a..280470f63 100644 --- a/src/server.c +++ b/src/server.c @@ -2196,6 +2196,14 @@ void initServer(void) { scriptingInit(1); slowlogInit(); latencyMonitorInit(); +} + +/* Some steps in server initialization need to be done last (after modules + * are loaded). + * Specifically, creation of threads due to a race bug in ld.so, in which + * Thread Local Storage initialization collides with dlopen call. + * see: https://sourceware.org/bugzilla/show_bug.cgi?id=19329 */ +void InitServerLast() { bioInit(); server.initial_memory_usage = zmalloc_used_memory(); } @@ -4197,6 +4205,7 @@ int main(int argc, char **argv) { linuxMemoryWarnings(); #endif moduleLoadFromQueue(); + InitServerLast(); loadDataFromDisk(); if (server.cluster_enabled) { if (verifyClusterConfigWithData() == C_ERR) { @@ -4211,6 +4220,7 @@ int main(int argc, char **argv) { if (server.sofd > 0) serverLog(LL_NOTICE,"The server is now ready to accept connections at %s", server.unixsocket); } else { + InitServerLast(); sentinelIsRunning(); } |