Thread

  1. [PATCH] Use integers not strings to identify backend type

    Álvaro Herrera <alvherre@kurilemu.de> — 2025-12-09T14:29:43Z

    ---
     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=<name>",
    - * where <name> indicates which postmaster child we are to become, and
    + * The first two command line arguments are expected to be "--forkchild=<kind>",
    + * where <kind> 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
    
    
    --ogkssrz7kzkktwbw--