Fix Pgpool-II child process crash during shutdown.
authorTatsuo Ishii <[email protected]>
Sat, 9 Nov 2024 08:42:46 +0000 (17:42 +0900)
committerTatsuo Ishii <[email protected]>
Sat, 9 Nov 2024 08:49:25 +0000 (17:49 +0900)
It is reported that pgpool child process crashes during shutdown.
[pgpool-general: 9261] Re: Segmentation fault during shutdown

The actual crash was in close_all_backend_connections().
close_all_backend_connections() was called because on_system_exit
registers child_will_go_down(). At the moment it seems pgpool child
had just started up and doing pool_init_cp(). The connection pool
object had not been completely initialized, that's cause of the crash.

To fix this, introduce a new static variable in child.c and set it
true when the connection pool object is initialized. In
child_will_go_down() it is checked and close_all_backend_connections()
is called only when the variable is set to true.

Problem reported and analyzed by: Emond Papegaaij
Backpatch-through: v4.2
Discussion: https://www.pgpool.net/pipermail/pgpool-general/2024-November/001938.html

src/protocol/child.c

index 3caca3d5d08cf18fa2369a74ee238ec17fd15042..a8c59aabce4c0e1d996231529b5365dab6009e99 100644 (file)
@@ -137,6 +137,11 @@ struct timeval startTime;
 bool           stop_now = false;
 #endif
 
+/*
+ * If true, connection pool has been initialized.
+ */
+static bool connection_pool_initialized = false;
+
 /*
 * child main loop
 */
@@ -223,6 +228,7 @@ do_child(int *fds)
        {
                child_exit(POOL_EXIT_AND_RESTART);
        }
+       connection_pool_initialized = true;
 
        /*
         * Open pool_passwd in child process.  This is necessary to avoid the file
@@ -1296,7 +1302,7 @@ child_will_go_down(int code, Datum arg)
        }
 
        /* let backend know now we are exiting */
-       if (pool_connection_pool)
+       if (connection_pool_initialized)
                close_all_backend_connections();
 }
 void