BUG/MINOR: mworker: fix memory leak due to master-worker fork

Before this fix, startup logs ring was duplicated before the fork(), so master
and worker had both the original startup_logs ring and the duplicated one. In
the worker context we freed the original ring and used a duplicated one. In
the master context we did nothing, but we still create a duplicated copy again
and again during the reload.

So, let's duplicate startup logs ring only in the worker context. Master
continues to use the original ring initialized in init() before its fork().
This commit is contained in:
Valentine Krasnobaeva 2024-10-15 12:39:50 +02:00 committed by Willy Tarreau
parent 8dd4efe42f
commit ae84f06025

View File

@ -2151,8 +2151,6 @@ static void init(int argc, char **argv)
struct mworker_proc *child;
struct ring *tmp_startup_logs = NULL;
/* at this point the worker must have his own startup_logs buffer */
tmp_startup_logs = startup_logs_dup(startup_logs);
worker_pid = fork();
switch (worker_pid) {
case -1:
@ -2160,7 +2158,11 @@ static void init(int argc, char **argv)
exit(EXIT_FAILURE);
case 0:
/* in child */
/* in child: at this point the worker must have his own startup_logs buffer */
tmp_startup_logs = startup_logs_dup(startup_logs);
if (tmp_startup_logs == NULL)
exit(EXIT_FAILURE);
startup_logs_free(startup_logs);
startup_logs = tmp_startup_logs;
/* This one must not be exported, it's internal! */