From 4c2e63bc3c78b567e83a4d6d0df60ddeb0f51a3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Herrera?= Date: Tue, 9 Dec 2025 15:29:43 +0100 Subject: [PATCH] Use integers not strings to identify backend type --- src/backend/postmaster/launch_backend.c | 32 +++++++++---------------- 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/src/backend/postmaster/launch_backend.c b/src/backend/postmaster/launch_backend.c index 976638a58ac..3606a569758 100644 --- a/src/backend/postmaster/launch_backend.c +++ b/src/backend/postmaster/launch_backend.c @@ -162,7 +162,7 @@ static bool save_backend_variables(BackendParameters *param, int child_slot, #endif const void *startup_data, size_t startup_data_len); -static pid_t internal_forkexec(const char *child_kind, int child_slot, +static pid_t internal_forkexec(int child_kind, int child_slot, const void *startup_data, size_t startup_data_len, ClientSocket *client_sock); @@ -217,7 +217,7 @@ postmaster_child_launch(BackendType child_type, int child_slot, ((BackendStartupData *) startup_data)->fork_started = GetCurrentTimestamp(); #ifdef EXEC_BACKEND - pid = internal_forkexec(child_process_kinds[child_type].name, child_slot, + pid = internal_forkexec(child_type, child_slot, startup_data, startup_data_len, client_sock); /* the child process will arrive in SubPostmasterMain */ #else /* !EXEC_BACKEND */ @@ -282,7 +282,7 @@ postmaster_child_launch(BackendType child_type, int child_slot, * - fork():s, and then exec():s the child process */ static pid_t -internal_forkexec(const char *child_kind, int child_slot, +internal_forkexec(int child_kind, int child_slot, const void *startup_data, size_t startup_data_len, ClientSocket *client_sock) { static unsigned long tmpBackendFileNum = 0; @@ -358,7 +358,7 @@ internal_forkexec(const char *child_kind, int child_slot, /* set up argv properly */ argv[0] = "postgres"; - snprintf(forkav, MAXPGPATH, "--forkchild=%s", child_kind); + snprintf(forkav, MAXPGPATH, "--forkchild=%d", child_kind); argv[1] = forkav; /* Insert temp file name after --forkchild argument */ argv[2] = tmpfilename; @@ -392,7 +392,7 @@ internal_forkexec(const char *child_kind, int child_slot, * file is complete. */ static pid_t -internal_forkexec(const char *child_kind, int child_slot, +internal_forkexec(int child_kind, int child_slot, const void *startup_data, size_t startup_data_len, ClientSocket *client_sock) { int retry_count = 0; @@ -444,7 +444,7 @@ retry: #else sprintf(paramHandleStr, "%lu", (DWORD) paramHandle); #endif - l = snprintf(cmdLine, sizeof(cmdLine) - 1, "\"%s\" --forkchild=\"%s\" %s", + l = snprintf(cmdLine, sizeof(cmdLine) - 1, "\"%s\" --forkchild=%d %s", postgres_exec_path, child_kind, paramHandleStr); if (l >= sizeof(cmdLine)) { @@ -567,8 +567,8 @@ retry: * to what it would be if we'd simply forked on Unix, and then * dispatch to the appropriate place. * - * The first two command line arguments are expected to be "--forkchild=", - * where indicates which postmaster child we are to become, and + * The first two command line arguments are expected to be "--forkchild=", + * where indicates which process type we are to become, and * the name of a variables file that we can read to load data that would * have been inherited by fork() on Unix. */ @@ -579,7 +579,6 @@ SubPostmasterMain(int argc, char *argv[]) size_t startup_data_len; char *child_kind; BackendType child_type; - bool found = false; TimestampTz fork_end; /* In EXEC_BACKEND case we will not have inherited these settings */ @@ -599,21 +598,12 @@ SubPostmasterMain(int argc, char *argv[]) if (argc != 3) elog(FATAL, "invalid subpostmaster invocation"); - /* Find the entry in child_process_kinds */ + /* Parse the --forkchild argument to find our process type */ if (strncmp(argv[1], "--forkchild=", 12) != 0) elog(FATAL, "invalid subpostmaster invocation (--forkchild argument missing)"); child_kind = argv[1] + 12; - found = false; - for (int idx = 0; idx < lengthof(child_process_kinds); idx++) - { - if (strcmp(child_process_kinds[idx].name, child_kind) == 0) - { - child_type = (BackendType) idx; - found = true; - break; - } - } - if (!found) + child_type = (BackendType) atoi(child_kind); + if (child_type <= B_INVALID || child_type > BACKEND_NUM_TYPES) elog(ERROR, "unknown child kind %s", child_kind); /* Read in the variables file */ -- 2.47.3