diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c index 2034722f0a4..47769c1d5f7 100644 --- a/src/backend/replication/slot.c +++ b/src/backend/replication/slot.c @@ -621,11 +621,19 @@ ReplicationSlotRelease(void) MyReplicationSlot = NULL; } - /* might not have been set when we've been a plain slot */ - LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE); - MyProc->statusFlags &= ~PROC_IN_LOGICAL_DECODING; - ProcGlobal->statusFlags[MyProc->pgxactoff] = MyProc->statusFlags; - LWLockRelease(ProcArrayLock); + /* + * Update statusFlags only if PROC_IN_LOGICAL_DECODING is set. An + * auxiliary process (checkpointer or startup process) may invalidate a + * slot. Auxiliary processes are not in the proc array, and pgxactoff + * would point at something which is not its own. + */ + if (MyProc->statusFlags & PROC_IN_LOGICAL_DECODING) + { + LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE); + MyProc->statusFlags &= ~PROC_IN_LOGICAL_DECODING; + ProcGlobal->statusFlags[MyProc->pgxactoff] = MyProc->statusFlags; + LWLockRelease(ProcArrayLock); + } } /*