Fix sporadic health check failures due to authentication failure.
authorTatsuo Ishii <ishii@postgresql.org>
Sat, 26 Oct 2024 04:19:39 +0000 (13:19 +0900)
committerTatsuo Ishii <ishii@postgresql.org>
Sat, 26 Oct 2024 04:19:39 +0000 (13:19 +0900)
It is reported that health check process fails due to authentication
failures.
[pgpool-general: 9236] Sporadic health check failures due to authentication failure
https://www.pgpool.net/pipermail/pgpool-general/2024-October/001913.html

When health_check_password is empty string, health check process looks
for the password from pool_passwd file. Problem is, the file
descriptor for the file is inherited from parent pgpool process. This
means that pgpool main and health check process (possibly multiple
process) share the same descriptor, which causes various problem
including the issue reported here. To fix the problem, re-open the
file when health check process starts so that each health check
process owns its own file descriptor.

Note that pgpool child process (responsible for frontend sessions)
already re-opens the file descriptor and they are related to the
issue.

Problem reported and analyzed by Emond Papegaaij.
Backpatch-through: v4.1
Discussion: https://www.pgpool.net/pipermail/pgpool-general/2024-October/001913.html

src/main/health_check.c

index d6551f4bccb1c675a0a16bba257619bf399ddb62..64b0507dff3b3ceb2de28c6b0fa4be0502137ed0 100644 (file)
@@ -154,6 +154,14 @@ do_health_check_child(int *node_id)
        /* Initialize per process context */
        pool_init_process_context();
 
+       /*
+        * Open pool_passwd.
+        */
+       if (strcmp("", pool_config->pool_passwd))
+       {
+               pool_reopen_passwd_file();
+       }
+
        if (sigsetjmp(local_sigjmp_buf, 1) != 0)
        {
                pool_signal(SIGALRM, SIG_IGN);