]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Assign "backend" type earlier during process start-up
authorÁlvaro Herrera <alvherre@kurilemu.de>
Wed, 4 Feb 2026 15:56:57 +0000 (16:56 +0100)
committerÁlvaro Herrera <alvherre@kurilemu.de>
Wed, 4 Feb 2026 15:56:57 +0000 (16:56 +0100)
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

15 files changed:
src/backend/postmaster/autovacuum.c
src/backend/postmaster/bgworker.c
src/backend/postmaster/bgwriter.c
src/backend/postmaster/checkpointer.c
src/backend/postmaster/launch_backend.c
src/backend/postmaster/pgarch.c
src/backend/postmaster/startup.c
src/backend/postmaster/syslogger.c
src/backend/postmaster/walsummarizer.c
src/backend/postmaster/walwriter.c
src/backend/replication/logical/slotsync.c
src/backend/replication/walreceiver.c
src/backend/storage/aio/method_worker.c
src/backend/tcop/backend_startup.c
src/backend/utils/error/elog.c

index 22379de1e315afee06b5956dc81715d32b1dbcf7..6fde740465ff9854fbeaa332699e72f57378a3e6 100644 (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);
index 51874481751db9fa69402ca4e218e3074e13805b..261ccd3f59cfa15820c9a0a4dcc55842baa9703d 100644 (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);
index 80e3088fc7e30d3e79e023a46a137d5d973ae894..0956bd39a85a0eb99473d9d86017534c0e7c82ab 100644 (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();
 
        /*
index 6482c21b8f92272945dcdc0081548cbba4ac77a4..e03c19123bc4c27d54f444a1b5bab604492ac860 100644 (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;
index 45690b11c993fe3ee073b5282ee529db7b92af3f..926fd6f2700aac3bc3699787bd02e17a8e30eb48 100644 (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);
index 1a20387c4bdac85f243d7d81463e9f266566848c..82731e452fce949acecb8373df6151c3cf01cc7e 100644 (file)
@@ -222,7 +222,6 @@ PgArchiverMain(const void *startup_data, size_t startup_data_len)
 {
        Assert(startup_data_len == 0);
 
-       MyBackendType = B_ARCHIVER;
        AuxiliaryProcessMainCommon();
 
        /*
index a1a4f65f9a96ae868397138b84da6cfc7d0a0012..cdbe53dd262e9e5e7e2dfc101c051b1addd8c7f9 100644 (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 */
index 1c443b3d126dad36ef944975656dc2cb9b71e478..86c5e376b4052f67342a6f350e29c09285611834 100644 (file)
@@ -206,7 +206,6 @@ SysLoggerMain(const void *startup_data, size_t startup_data_len)
 
        now = MyStartTime;
 
-       MyBackendType = B_LOGGER;
        init_ps_display(NULL);
 
        /*
index c3d56c866d3442398bf63bc209986e946f6843e9..2d8f57099fd7ea39a8cd66b21e48e5e5255b8df6 100644 (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,
index 38ec8a4c8c7b33950ab99ab4f014296370568bbc..23e79a32345b0fe13e1f4a6e0f50abaea932e5c1 100644 (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();
 
        /*
index 1c343d03d214719120989ebea25d3c6d31392e59..af5682ce50e65a858e01e33b1e397b81f8688a29 100644 (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);
index 8b99160ed0e81e3572ae39462caa9d766499d959..10e64a7d1f4081cc9e3bdbc9a831bc982f89cb2c 100644 (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();
 
        /*
index d7c144cd8f76edcdccb702b823e9fe903e97c747..d9617c20e76cecbfe9b89b95785655958cf322fc 100644 (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);
index 94a7b839563d8f366d64e89b7d24625e54e7f578..c517115927c9614696e37b6479597883b8e6eba3 100644 (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
index aa530d3685ec00a13638de634f4c466207b2f349..e6a4ef990596deec278a7e07ea5cbb7fde545839 100644 (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);