Refactor how InitProcess is called
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Sun, 3 Dec 2023 14:39:18 +0000 (16:39 +0200)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Sun, 3 Dec 2023 14:39:18 +0000 (16:39 +0200)
The order of process initialization steps is now more consistent
between !EXEC_BACKEND and EXEC_BACKEND modes. InitProcess() is called
at the same place in either mode. We can now also move the
AttachSharedMemoryStructs() call into InitProcess() itself. This
reduces the number of "#ifdef EXEC_BACKEND" blocks.

Reviewed-by: Tristan Partin, Andres Freund, Alexander Lakhin
Discussion: https://www.postgresql.org/message-id/7a59b073-5b5b-151e-7ed3-8b01ff7ce9ef@iki.fi

src/backend/postmaster/autovacuum.c
src/backend/postmaster/auxprocess.c
src/backend/postmaster/bgworker.c
src/backend/postmaster/postmaster.c
src/backend/storage/lmgr/proc.c

index 86a3b3d8be2ac2a04110981dfc148373a55fef5e..2f54485c217d71194cd98a0d2cca4f5dcc800380 100644 (file)
@@ -476,14 +476,10 @@ AutoVacLauncherMain(int argc, char *argv[])
        pqsignal(SIGCHLD, SIG_DFL);
 
        /*
-        * Create a per-backend PGPROC struct in shared memory, except in the
-        * EXEC_BACKEND case where this was done in SubPostmasterMain. We must do
-        * this before we can use LWLocks (and in the EXEC_BACKEND case we already
-        * had to do some stuff with LWLocks).
+        * Create a per-backend PGPROC struct in shared memory.  We must do this
+        * before we can use LWLocks or access any shared memory.
         */
-#ifndef EXEC_BACKEND
        InitProcess();
-#endif
 
        /* Early initialization */
        BaseInit();
@@ -1548,14 +1544,10 @@ AutoVacWorkerMain(int argc, char *argv[])
        pqsignal(SIGCHLD, SIG_DFL);
 
        /*
-        * Create a per-backend PGPROC struct in shared memory, except in the
-        * EXEC_BACKEND case where this was done in SubPostmasterMain. We must do
-        * this before we can use LWLocks (and in the EXEC_BACKEND case we already
-        * had to do some stuff with LWLocks).
+        * Create a per-backend PGPROC struct in shared memory.  We must do this
+        * before we can use LWLocks or access any shared memory.
         */
-#ifndef EXEC_BACKEND
        InitProcess();
-#endif
 
        /* Early initialization */
        BaseInit();
index cae6feb3562112e5f81809a04605b740dda39bd2..bae6f68c40249d54a98c8e3a1c18ef4692d1f63c 100644 (file)
@@ -97,12 +97,9 @@ AuxiliaryProcessMain(AuxProcType auxtype)
         */
 
        /*
-        * Create a PGPROC so we can use LWLocks.  In the EXEC_BACKEND case, this
-        * was already done by SubPostmasterMain().
+        * Create a PGPROC so we can use LWLocks and access shared memory.
         */
-#ifndef EXEC_BACKEND
        InitAuxiliaryProcess();
-#endif
 
        BaseInit();
 
index d936986c2bf3031aefeda0e1cc9d098695af404e..c345639086ce989b6875e9fc6264e9c54436963e 100644 (file)
@@ -810,14 +810,10 @@ BackgroundWorkerMain(void)
        PG_exception_stack = &local_sigjmp_buf;
 
        /*
-        * Create a per-backend PGPROC struct in shared memory, except in the
-        * EXEC_BACKEND case where this was done in SubPostmasterMain. We must do
-        * this before we can use LWLocks (and in the EXEC_BACKEND case we already
-        * had to do some stuff with LWLocks).
+        * Create a per-backend PGPROC struct in shared memory.  We must do this
+        * before we can use LWLocks or access any shared memory.
         */
-#ifndef EXEC_BACKEND
        InitProcess();
-#endif
 
        /*
         * Early initialization.
index 92e51bd54dbe2e2213929d081b9c0fd17a08785e..49cbd8cd05fce67fc19da1ba0504f35e0a664ff6 100644 (file)
@@ -4100,15 +4100,6 @@ BackendStartup(Port *port)
                /* Perform additional initialization and collect startup packet */
                BackendInitialize(port);
 
-               /*
-                * Create a per-backend PGPROC struct in shared memory. We must do
-                * this before we can use LWLocks. In the !EXEC_BACKEND case (here)
-                * this could be delayed a bit further, but EXEC_BACKEND needs to do
-                * stuff with LWLocks before PostgresMain(), so we do it here as well
-                * for symmetry.
-                */
-               InitProcess();
-
                /* And run the backend */
                BackendRun(port);
        }
@@ -4419,6 +4410,12 @@ BackendInitialize(Port *port)
 static void
 BackendRun(Port *port)
 {
+       /*
+        * Create a per-backend PGPROC struct in shared memory.  We must do this
+        * before we can use LWLocks or access any shared memory.
+        */
+       InitProcess();
+
        /*
         * Make sure we aren't in PostmasterContext anymore.  (We can't delete it
         * just yet, though, because InitPostgres will need the HBA data.)
@@ -4918,12 +4915,6 @@ SubPostmasterMain(int argc, char *argv[])
                /* Restore basic shared memory pointers */
                InitShmemAccess(UsedShmemSegAddr);
 
-               /* Need a PGPROC to run AttachSharedMemoryStructs */
-               InitProcess();
-
-               /* Attach process to shared data structures */
-               AttachSharedMemoryStructs();
-
                /* And run the backend */
                BackendRun(port);               /* does not return */
        }
@@ -4936,12 +4927,6 @@ SubPostmasterMain(int argc, char *argv[])
                /* Restore basic shared memory pointers */
                InitShmemAccess(UsedShmemSegAddr);
 
-               /* Need a PGPROC to run AttachSharedMemoryStructs */
-               InitAuxiliaryProcess();
-
-               /* Attach process to shared data structures */
-               AttachSharedMemoryStructs();
-
                auxtype = atoi(argv[3]);
                AuxiliaryProcessMain(auxtype);  /* does not return */
        }
@@ -4950,12 +4935,6 @@ SubPostmasterMain(int argc, char *argv[])
                /* Restore basic shared memory pointers */
                InitShmemAccess(UsedShmemSegAddr);
 
-               /* Need a PGPROC to run AttachSharedMemoryStructs */
-               InitProcess();
-
-               /* Attach process to shared data structures */
-               AttachSharedMemoryStructs();
-
                AutoVacLauncherMain(argc - 2, argv + 2);        /* does not return */
        }
        if (strcmp(argv[1], "--forkavworker") == 0)
@@ -4963,12 +4942,6 @@ SubPostmasterMain(int argc, char *argv[])
                /* Restore basic shared memory pointers */
                InitShmemAccess(UsedShmemSegAddr);
 
-               /* Need a PGPROC to run AttachSharedMemoryStructs */
-               InitProcess();
-
-               /* Attach process to shared data structures */
-               AttachSharedMemoryStructs();
-
                AutoVacWorkerMain(argc - 2, argv + 2);  /* does not return */
        }
        if (strcmp(argv[1], "--forkbgworker") == 0)
@@ -4979,12 +4952,6 @@ SubPostmasterMain(int argc, char *argv[])
                /* Restore basic shared memory pointers */
                InitShmemAccess(UsedShmemSegAddr);
 
-               /* Need a PGPROC to run AttachSharedMemoryStructs */
-               InitProcess();
-
-               /* Attach process to shared data structures */
-               AttachSharedMemoryStructs();
-
                MyBgworkerEntry = worker;
                BackgroundWorkerMain();
        }
index 6648c6e5e7e2223fdf8c43e5b56a5a024ba5b2ff..b6451d9d0830fdd58bb7b6831d7a08a279d9a7ff 100644 (file)
@@ -291,7 +291,7 @@ InitProcGlobal(void)
 }
 
 /*
- * InitProcess -- initialize a per-process data structure for this backend
+ * InitProcess -- initialize a per-process PGPROC entry for this backend
  */
 void
 InitProcess(void)
@@ -461,6 +461,16 @@ InitProcess(void)
         */
        InitLWLockAccess();
        InitDeadLockChecking();
+
+#ifdef EXEC_BACKEND
+
+       /*
+        * Initialize backend-local pointers to all the shared data structures.
+        * (We couldn't do this until now because it needs LWLocks.)
+        */
+       if (IsUnderPostmaster)
+               AttachSharedMemoryStructs();
+#endif
 }
 
 /*
@@ -487,7 +497,7 @@ InitProcessPhase2(void)
 }
 
 /*
- * InitAuxiliaryProcess -- create a per-auxiliary-process data structure
+ * InitAuxiliaryProcess -- create a PGPROC entry for an auxiliary process
  *
  * This is called by bgwriter and similar processes so that they will have a
  * MyProc value that's real enough to let them wait for LWLocks.  The PGPROC
@@ -621,6 +631,16 @@ InitAuxiliaryProcess(void)
         * acquired in aux processes.)
         */
        InitLWLockAccess();
+
+#ifdef EXEC_BACKEND
+
+       /*
+        * Initialize backend-local pointers to all the shared data structures.
+        * (We couldn't do this until now because it needs LWLocks.)
+        */
+       if (IsUnderPostmaster)
+               AttachSharedMemoryStructs();
+#endif
 }
 
 /*