Refactor how InitProcess is called
authorHeikki Linnakangas <[email protected]>
Sun, 3 Dec 2023 14:39:18 +0000 (16:39 +0200)
committerHeikki Linnakangas <[email protected]>
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
 }
 
 /*