diff --git a/src/backend/postmaster/checkpointer.c b/src/backend/postmaster/checkpointer.c index a09d4097d51..f6351f1eb10 100644 --- a/src/backend/postmaster/checkpointer.c +++ b/src/backend/postmaster/checkpointer.c @@ -1114,8 +1114,7 @@ RequestCheckpoint(int flags) #define MAX_SIGNAL_TRIES 600 /* max wait 60.0 sec */ for (ntries = 0;; ntries++) { - volatile PROC_HDR *procglobal = ProcGlobal; - ProcNumber checkpointerProc = pg_atomic_read_u32(&procglobal->checkpointerProc); + ProcNumber checkpointerProc = pg_atomic_read_u32(&ProcGlobal->checkpointerProc); if (checkpointerProc == INVALID_PROC_NUMBER) { @@ -1536,8 +1535,7 @@ FirstCallSinceLastCheckpoint(void) void WakeupCheckpointer(void) { - volatile PROC_HDR *procglobal = ProcGlobal; - ProcNumber checkpointerProc = pg_atomic_read_u32(&procglobal->checkpointerProc); + ProcNumber checkpointerProc = pg_atomic_read_u32(&ProcGlobal->checkpointerProc); if (checkpointerProc != INVALID_PROC_NUMBER) SetLatch(&GetPGProcByNumber(checkpointerProc)->procLatch); diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c index 59640bb4f97..9d6e69175a5 100644 --- a/src/backend/storage/lmgr/proc.c +++ b/src/backend/storage/lmgr/proc.c @@ -550,6 +550,10 @@ InitProcess(void) */ PGSemaphoreReset(MyProc->sem); + /* autovacuum launcher is specially advertised in ProcGlobal */ + if (MyBackendType == B_AUTOVAC_LAUNCHER) + pg_atomic_write_u32(&ProcGlobal->avLauncherProc, MyProcNumber); + /* * Arrange to clean up at backend exit. */ @@ -726,8 +730,6 @@ InitAuxiliaryProcess(void) PGSemaphoreReset(MyProc->sem); /* Some aux processes are also advertised in ProcGlobal */ - if (MyBackendType == B_AUTOVAC_LAUNCHER) - pg_atomic_write_u32(&ProcGlobal->avLauncherProc, MyProcNumber); if (MyBackendType == B_WAL_WRITER) pg_atomic_write_u32(&ProcGlobal->walwriterProc, MyProcNumber); if (MyBackendType == B_CHECKPOINTER) @@ -989,6 +991,12 @@ ProcKill(int code, Datum arg) SwitchBackToLocalLatch(); DisownLatch(&MyProc->procLatch); + if (MyBackendType == B_AUTOVAC_LAUNCHER) + { + Assert(pg_atomic_read_u32(&ProcGlobal->avLauncherProc) == MyProcNumber); + pg_atomic_write_u32(&ProcGlobal->avLauncherProc, INVALID_PROC_NUMBER); + } + proc = MyProc; procgloballist = proc->procgloballist; @@ -1113,11 +1121,6 @@ AuxiliaryProcKill(int code, Datum arg) /* * If this was one of the aux processes advertised in ProcGlobal, clear it */ - if (MyBackendType == B_AUTOVAC_LAUNCHER) - { - Assert(pg_atomic_read_u32(&ProcGlobal->avLauncherProc) == MyProcNumber); - pg_atomic_write_u32(&ProcGlobal->avLauncherProc, INVALID_PROC_NUMBER); - } if (MyBackendType == B_WAL_WRITER) { Assert(pg_atomic_read_u32(&ProcGlobal->walwriterProc) == MyProcNumber); diff --git a/src/include/storage/proc.h b/src/include/storage/proc.h index 0314f979e60..03a1a466fa8 100644 --- a/src/include/storage/proc.h +++ b/src/include/storage/proc.h @@ -491,9 +491,10 @@ typedef struct PROC_HDR * Current proc numbers of some auxiliary processes. There can be only one * of each of these running at a time. */ - pg_atomic_uint32 avLauncherProc; pg_atomic_uint32 walwriterProc; pg_atomic_uint32 checkpointerProc; + /* avlauncher is not an aux process, but it is advertised the same way */ + pg_atomic_uint32 avLauncherProc; /* Current shared estimate of appropriate spins_per_delay value */ int spins_per_delay;