From 0473f732fc3ca894dfdf6e98297582ef10fea7d8 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Wed, 11 Oct 2023 13:38:00 +0300 Subject: [PATCH v2 3/6] Pass CAC as argument to backend process. We used to smuggle it to the child process in the Port struct, but it seems better to pass it down as a separate argument. Reviewed-by: Tristan Partin, Andres Freund Discussion: https://www.postgresql.org/message-id/7a59b073-5b5b-151e-7ed3-8b01ff7ce9ef@iki.fi --- src/backend/postmaster/postmaster.c | 43 +++++++++++++++++++++-------- src/include/libpq/libpq-be.h | 12 -------- 2 files changed, 31 insertions(+), 24 deletions(-) diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 13ebf7ac4de..936828df010 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -418,7 +418,18 @@ static void HandleChildCrash(int pid, int exitstatus, const char *procname); static void LogChildExit(int lev, const char *procname, int pid, int exitstatus); static void PostmasterStateMachine(void); -static void BackendInitialize(Port *port); + +typedef enum CAC_state +{ + CAC_OK, + CAC_STARTUP, + CAC_SHUTDOWN, + CAC_RECOVERY, + CAC_NOTCONSISTENT, + CAC_TOOMANY +} CAC_state; + +static void BackendInitialize(Port *port, CAC_state cac); static void BackendRun(Port *port) pg_attribute_noreturn(); static void ExitPostmaster(int status) pg_attribute_noreturn(); static int ServerLoop(void); @@ -475,7 +486,7 @@ typedef struct } win32_deadchild_waitinfo; #endif /* WIN32 */ -static pid_t backend_forkexec(Port *port); +static pid_t backend_forkexec(Port *port, CAC_state cac); static pid_t internal_forkexec(int argc, char *argv[], Port *port); /* Type for a socket that can be inherited to a client process */ @@ -4037,6 +4048,7 @@ BackendStartup(Port *port) { Backend *bn; /* for backend cleanup */ pid_t pid; + CAC_state cac; /* * Create backend data structure. Better before the fork() so we can @@ -4068,8 +4080,8 @@ BackendStartup(Port *port) bn->cancel_key = MyCancelKey; /* Pass down canAcceptConnections state */ - port->canAcceptConnections = canAcceptConnections(BACKEND_TYPE_NORMAL); - bn->dead_end = (port->canAcceptConnections != CAC_OK); + cac = canAcceptConnections(BACKEND_TYPE_NORMAL); + bn->dead_end = (cac != CAC_OK); /* * Unless it's a dead_end child, assign it a child slot number @@ -4083,7 +4095,7 @@ BackendStartup(Port *port) bn->bgworker_notify = false; #ifdef EXEC_BACKEND - pid = backend_forkexec(port); + pid = backend_forkexec(port, cac); #else /* !EXEC_BACKEND */ pid = fork_process(); if (pid == 0) /* child */ @@ -4095,7 +4107,7 @@ BackendStartup(Port *port) ClosePostmasterPorts(false); /* Perform additional initialization and collect startup packet */ - BackendInitialize(port); + BackendInitialize(port, cac); /* And run the backend */ BackendRun(port); @@ -4182,7 +4194,7 @@ report_fork_failure_to_client(Port *port, int errnum) * but have not yet set up most of our local pointers to shmem structures. */ static void -BackendInitialize(Port *port) +BackendInitialize(Port *port, CAC_state cac) { int status; int ret; @@ -4315,7 +4327,7 @@ BackendInitialize(Port *port) * now instead of wasting cycles on an authentication exchange. (This also * allows a pg_ping utility to be written.) */ - switch (port->canAcceptConnections) + switch (cac) { case CAC_STARTUP: ereport(FATAL, @@ -4460,15 +4472,19 @@ postmaster_forkexec(int argc, char *argv[]) * returns the pid of the fork/exec'd process, or -1 on failure */ static pid_t -backend_forkexec(Port *port) +backend_forkexec(Port *port, CAC_state cac) { - char *av[4]; + char *av[5]; int ac = 0; + char cacbuf[10]; av[ac++] = "postgres"; av[ac++] = "--forkbackend"; av[ac++] = NULL; /* filled in by internal_forkexec */ + snprintf(cacbuf, sizeof(cacbuf), "%d", (int) cac); + av[ac++] = cacbuf; + av[ac] = NULL; Assert(ac < lengthof(av)); @@ -4872,7 +4888,10 @@ SubPostmasterMain(int argc, char *argv[]) /* Run backend or appropriate child */ if (strcmp(argv[1], "--forkbackend") == 0) { - Assert(argc == 3); /* shouldn't be any more args */ + CAC_state cac; + + Assert(argc == 4); + cac = (CAC_state) atoi(argv[3]); /* * Need to reinitialize the SSL library in the backend, since the @@ -4906,7 +4925,7 @@ SubPostmasterMain(int argc, char *argv[]) * PGPROC slots, we have already initialized libpq and are able to * report the error to the client. */ - BackendInitialize(&port); + BackendInitialize(&port, cac); /* Restore basic shared memory pointers */ InitShmemAccess(UsedShmemSegAddr); diff --git a/src/include/libpq/libpq-be.h b/src/include/libpq/libpq-be.h index a0b74c8095f..335cb2de44a 100644 --- a/src/include/libpq/libpq-be.h +++ b/src/include/libpq/libpq-be.h @@ -58,17 +58,6 @@ typedef struct #include "libpq/pqcomm.h" -typedef enum CAC_state -{ - CAC_OK, - CAC_STARTUP, - CAC_SHUTDOWN, - CAC_RECOVERY, - CAC_NOTCONSISTENT, - CAC_TOOMANY -} CAC_state; - - /* * GSSAPI specific state information */ @@ -156,7 +145,6 @@ typedef struct Port int remote_hostname_resolv; /* see above */ int remote_hostname_errcode; /* see above */ char *remote_port; /* text rep of remote port */ - CAC_state canAcceptConnections; /* postmaster connection status */ /* * Information that needs to be saved from the startup packet and passed -- 2.39.2