diff --git a/src/include/pool.h b/src/include/pool.h index ea6f87e12..65907dcf1 100644 --- a/src/include/pool.h +++ b/src/include/pool.h @@ -4,8 +4,8 @@ * pgpool: a language independent connection pool server for PostgreSQL * written by Tatsuo Ishii * - * Portions Copyright (c) 2003-2025 PgPool Global Development Group - * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group + * Portions Copyright (c) 2003-2026 PgPool Global Development Group + * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * Permission to use, copy, modify, and distribute this software and @@ -709,6 +709,15 @@ extern bool pool_acquire_follow_primary_lock(bool block, bool remote_reques); extern void pool_release_follow_primary_lock(bool remote_reques); extern void pool_signal_logrotate(void); +/* + * Close listening sockets + * following defines are for "kind" param. + */ +#define POOL_CLOSE_PGPOOL_LISTENING_SOCKS 0x01 /* pgpool sockets */ +#define POOL_CLOSE_PCP_LISTENING_SOCKS 0x02 /* pcp sockets */ +extern void close_listening_sockets(int kind); + + /* strlcpy.c */ #ifndef HAVE_STRLCPY extern size_t strlcpy(char *dst, const char *src, size_t siz); diff --git a/src/main/pgpool_main.c b/src/main/pgpool_main.c index fa05e15e7..bf7c452e2 100644 --- a/src/main/pgpool_main.c +++ b/src/main/pgpool_main.c @@ -212,6 +212,7 @@ static struct sockaddr_un *pcp_un_addrs; /* unix domain socket path for PCP */ ProcessInfo *process_info = NULL; /* Per child info table on shmem */ volatile User1SignalSlot *user1SignalSlot = NULL; /* User 1 signal slot on * shmem */ + int current_child_process_count; /* @@ -815,6 +816,9 @@ pcp_fork_a_child(int *fds, char *pcp_conf_file) on_exit_reset(); SetProcessGlobalVariables(PT_PCP); + /* close pgpool listening sockets */ + close_listening_sockets(POOL_CLOSE_PGPOOL_LISTENING_SOCKS); + close(pipe_fds[0]); close(pipe_fds[1]); @@ -862,6 +866,9 @@ fork_a_child(int *fds, int id) SetProcessGlobalVariables(PT_CHILD); + /* close pcp listening sockets */ + close_listening_sockets(POOL_CLOSE_PCP_LISTENING_SOCKS); + /* call child main */ POOL_SETMASK(&UnBlockSig); health_check_timer_expired = 0; @@ -909,6 +916,14 @@ worker_fork_a_child(ProcessType type, void (*func) (void *), void *params) SetProcessGlobalVariables(type); + /* + * Close pgpool listening sockets and pcp listening sockets if they + * are already setup. They are not ncessary for woker process (health + * check and streaming replication check process). + */ + close_listening_sockets(POOL_CLOSE_PGPOOL_LISTENING_SOCKS | + POOL_CLOSE_PCP_LISTENING_SOCKS); + ereport(LOG, (errmsg("process started"))); @@ -5227,3 +5242,25 @@ select_victim_processes(int *process_info_idxs, int count) } return selected_count; } + +/* + * Close all listening sockets + * + * kind bitmap specifies which listening sockets to be closed. + */ +void +close_listening_sockets(int kind) +{ + int i; + + if (kind & POOL_CLOSE_PGPOOL_LISTENING_SOCKS && fds != NULL) + { + for (i = 0; fds[i] > 0; i++) + close(fds[i]); + } + if (kind & POOL_CLOSE_PCP_LISTENING_SOCKS && pcp_fds != NULL) + { + for (i = 0; pcp_fds[i] > 0; i++) + close(pcp_fds[i]); + } +} diff --git a/src/watchdog/wd_lifecheck.c b/src/watchdog/wd_lifecheck.c index 86caf9b4b..a6958a395 100644 --- a/src/watchdog/wd_lifecheck.c +++ b/src/watchdog/wd_lifecheck.c @@ -6,7 +6,7 @@ * pgpool: a language independent connection pool server for PostgreSQL * written by Tatsuo Ishii * - * Copyright (c) 2003-2025 PgPool Global Development Group + * Copyright (c) 2003-2026 PgPool Global Development Group * * Permission to use, copy, modify, and distribute this software and * its documentation for any purpose and without fee is hereby @@ -367,6 +367,10 @@ fork_lifecheck_child(void) on_exit_reset(); SetProcessGlobalVariables(PT_LIFECHECK); + /* close pgpool/pcp listening sockets */ + close_listening_sockets(POOL_CLOSE_PGPOOL_LISTENING_SOCKS | + POOL_CLOSE_PCP_LISTENING_SOCKS); + /* call lifecheck child main */ POOL_SETMASK(&UnBlockSig); lifecheck_main();