From 82d7132957fadd6faf4de1a794b2974c389e0ed2 Mon Sep 17 00:00:00 2001 From: Tatsuo Ishii Date: Sat, 9 Nov 2024 17:42:46 +0900 Subject: [PATCH] Fix Pgpool-II child process crash during shutdown. 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 | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/protocol/child.c b/src/protocol/child.c index c12a5a2c1..ee7437770 100644 --- a/src/protocol/child.c +++ b/src/protocol/child.c @@ -140,6 +140,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 @@ -1351,7 +1357,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(); }