From fd5e8b440dfd633be74e3dd3382d4a9038dba24f Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Sun, 3 Dec 2023 16:39:18 +0200 Subject: [PATCH] Refactor how InitProcess is called 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 | 16 +++------- src/backend/postmaster/auxprocess.c | 5 +--- src/backend/postmaster/bgworker.c | 8 ++--- src/backend/postmaster/postmaster.c | 45 ++++------------------------- src/backend/storage/lmgr/proc.c | 24 +++++++++++++-- 5 files changed, 35 insertions(+), 63 deletions(-) diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 86a3b3d8be2..2f54485c217 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -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(); diff --git a/src/backend/postmaster/auxprocess.c b/src/backend/postmaster/auxprocess.c index cae6feb3562..bae6f68c402 100644 --- a/src/backend/postmaster/auxprocess.c +++ b/src/backend/postmaster/auxprocess.c @@ -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(); diff --git a/src/backend/postmaster/bgworker.c b/src/backend/postmaster/bgworker.c index d936986c2bf..c345639086c 100644 --- a/src/backend/postmaster/bgworker.c +++ b/src/backend/postmaster/bgworker.c @@ -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. diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 92e51bd54db..49cbd8cd05f 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -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(); } diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c index 6648c6e5e7e..b6451d9d083 100644 --- a/src/backend/storage/lmgr/proc.c +++ b/src/backend/storage/lmgr/proc.c @@ -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 } /*