diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 4b9fd76294d..e67046318a6 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -5771,9 +5771,12 @@ LockBufferForCleanup(Buffer buffer) } bufHdr->wait_backend_pgprocno = MyProcNumber; PinCountWaitBuf = bufHdr; - UnlockBufHdrExt(bufHdr, buf_state, - BM_PIN_COUNT_WAITER, 0, - 0); + for (volatile int i = 0; i < 10000000; i++); + buf_state = UnlockBufHdrExt(bufHdr, buf_state, + BM_PIN_COUNT_WAITER, 0, + 0); + if (BUF_STATE_GET_REFCOUNT(buf_state) == 1) + elog(LOG, "cleanup-lock repro: refcount_is_one_after_waiter_publication"); LockBuffer(buffer, BUFFER_LOCK_UNLOCK); /* Wait to be signaled by UnpinBuffer() */ @@ -5822,7 +5825,11 @@ LockBufferForCleanup(Buffer buffer) SetStartupBufferPinWaitBufId(-1); } else + { + elog(LOG, "cleanup-lock repro: before ProcWaitForSignal"); ProcWaitForSignal(WAIT_EVENT_BUFFER_PIN); + elog(LOG, "cleanup-lock repro: after ProcWaitForSignal"); + } /* * Remove flag marking us as waiter. Normally this will not be set