Assign "backend" type earlier during process start-up

Instead of assigning the backend type in the Main function of each
postmaster child, do it right after fork(), by which time it is already
known by postmaster_child_launch().  This reduces the time frame during
which MyBackendType is incorrect.

Before this commit, ProcessStartupPacket would overwrite MyBackendType
to B_BACKEND for dead-end backends, which is quite dubious.  Stop that.

We may now see MyBackendType == B_BG_WORKER before setting up
MyBgworkerEntry.  As far as I can see this is only a problem if we try
to log a message and %b is in log_line_prefix, so we now have a constant
string to cover that case.  Previously, it would print "unrecognized",
which seems strictly worse.

Author: Euler Taveira <euler@eulerto.com>
Discussion: https://postgr.es/m/e85c6671-1600-4112-8887-f97a8a5d07b2@app.fastmail.com
This commit is contained in:
Álvaro Herrera 2026-02-04 16:56:57 +01:00
parent 36ead71232
commit 0c8e082fba
No known key found for this signature in database
GPG key ID: 1C20ACB9D5C564AE
15 changed files with 10 additions and 17 deletions

View file

@ -385,7 +385,6 @@ AutoVacLauncherMain(const void *startup_data, size_t startup_data_len)
PostmasterContext = NULL;
}
MyBackendType = B_AUTOVAC_LAUNCHER;
init_ps_display(NULL);
ereport(DEBUG1,
@ -1398,7 +1397,6 @@ AutoVacWorkerMain(const void *startup_data, size_t startup_data_len)
PostmasterContext = NULL;
}
MyBackendType = B_AUTOVAC_WORKER;
init_ps_display(NULL);
Assert(GetProcessingMode() == InitProcessing);

View file

@ -759,7 +759,6 @@ BackgroundWorkerMain(const void *startup_data, size_t startup_data_len)
}
MyBgworkerEntry = worker;
MyBackendType = B_BG_WORKER;
init_ps_display(worker->bgw_name);
Assert(GetProcessingMode() == InitProcessing);

View file

@ -94,7 +94,6 @@ BackgroundWriterMain(const void *startup_data, size_t startup_data_len)
Assert(startup_data_len == 0);
MyBackendType = B_BG_WRITER;
AuxiliaryProcessMainCommon();
/*

View file

@ -199,7 +199,6 @@ CheckpointerMain(const void *startup_data, size_t startup_data_len)
Assert(startup_data_len == 0);
MyBackendType = B_CHECKPOINTER;
AuxiliaryProcessMainCommon();
CheckpointerShmem->checkpointer_pid = MyProcPid;

View file

@ -223,6 +223,8 @@ postmaster_child_launch(BackendType child_type, int child_slot,
pid = fork_process();
if (pid == 0) /* child */
{
MyBackendType = child_type;
/* Capture and transfer timings that may be needed for logging */
if (IsExternalConnectionBackend(child_type))
{
@ -607,6 +609,7 @@ SubPostmasterMain(int argc, char *argv[])
child_type = (BackendType) atoi(child_kind);
if (child_type <= B_INVALID || child_type > BACKEND_NUM_TYPES - 1)
elog(ERROR, "unknown child kind %s", child_kind);
MyBackendType = child_type;
/* Read in the variables file */
read_backend_variables(argv[2], &startup_data, &startup_data_len);

View file

@ -222,7 +222,6 @@ PgArchiverMain(const void *startup_data, size_t startup_data_len)
{
Assert(startup_data_len == 0);
MyBackendType = B_ARCHIVER;
AuxiliaryProcessMainCommon();
/*

View file

@ -217,7 +217,6 @@ StartupProcessMain(const void *startup_data, size_t startup_data_len)
{
Assert(startup_data_len == 0);
MyBackendType = B_STARTUP;
AuxiliaryProcessMainCommon();
/* Arrange to clean up at startup process exit */

View file

@ -206,7 +206,6 @@ SysLoggerMain(const void *startup_data, size_t startup_data_len)
now = MyStartTime;
MyBackendType = B_LOGGER;
init_ps_display(NULL);
/*

View file

@ -234,7 +234,6 @@ WalSummarizerMain(const void *startup_data, size_t startup_data_len)
Assert(startup_data_len == 0);
MyBackendType = B_WAL_SUMMARIZER;
AuxiliaryProcessMainCommon();
ereport(DEBUG1,

View file

@ -94,7 +94,6 @@ WalWriterMain(const void *startup_data, size_t startup_data_len)
Assert(startup_data_len == 0);
MyBackendType = B_WAL_WRITER;
AuxiliaryProcessMainCommon();
/*

View file

@ -1541,8 +1541,6 @@ ReplSlotSyncWorkerMain(const void *startup_data, size_t startup_data_len)
Assert(startup_data_len == 0);
MyBackendType = B_SLOTSYNC_WORKER;
init_ps_display(NULL);
Assert(GetProcessingMode() == InitProcessing);

View file

@ -169,7 +169,6 @@ WalReceiverMain(const void *startup_data, size_t startup_data_len)
Assert(startup_data_len == 0);
MyBackendType = B_WAL_RECEIVER;
AuxiliaryProcessMainCommon();
/*

View file

@ -390,7 +390,6 @@ IoWorkerMain(const void *startup_data, size_t startup_data_len)
volatile int error_errno = 0;
char cmd[128];
MyBackendType = B_IO_WORKER;
AuxiliaryProcessMainCommon();
pqsignal(SIGHUP, SignalHandlerForConfigReload);

View file

@ -846,10 +846,9 @@ ProcessStartupPacket(Port *port, bool ssl_done, bool gss_done)
if (strlen(port->user_name) >= NAMEDATALEN)
port->user_name[NAMEDATALEN - 1] = '\0';
Assert(MyBackendType == B_BACKEND || MyBackendType == B_DEAD_END_BACKEND);
if (am_walsender)
MyBackendType = B_WAL_SENDER;
else
MyBackendType = B_BACKEND;
/*
* Normal walsender backends, e.g. for streaming replication, are not

View file

@ -2779,7 +2779,12 @@ get_backend_type_for_log(void)
if (MyProcPid == PostmasterPid)
backend_type_str = "postmaster";
else if (MyBackendType == B_BG_WORKER)
backend_type_str = MyBgworkerEntry->bgw_type;
{
if (MyBgworkerEntry)
backend_type_str = MyBgworkerEntry->bgw_type;
else
backend_type_str = "early bgworker";
}
else
backend_type_str = GetBackendTypeDesc(MyBackendType);