diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/replication/syncrep.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/src/backend/replication/syncrep.c b/src/backend/replication/syncrep.c index 16aee1de4c2..59a3d5bda6b 100644 --- a/src/backend/replication/syncrep.c +++ b/src/backend/replication/syncrep.c @@ -361,10 +361,18 @@ SyncRepCancelWait(void) void SyncRepCleanupAtProcExit(void) { + /* + * First check if we are removed from the queue without the lock to not + * slow down backend exit. + */ if (!SHMQueueIsDetached(&(MyProc->syncRepLinks))) { LWLockAcquire(SyncRepLock, LW_EXCLUSIVE); - SHMQueueDelete(&(MyProc->syncRepLinks)); + + /* maybe we have just been removed, so recheck */ + if (!SHMQueueIsDetached(&(MyProc->syncRepLinks))) + SHMQueueDelete(&(MyProc->syncRepLinks)); + LWLockRelease(SyncRepLock); } } |