before-5310-cleanup-lock-reproducer.patch
application/octet-stream
Filename: before-5310-cleanup-lock-reproducer.patch
Type: application/octet-stream
Part: 0
Patch
Format: unified
Series: patch 5310
| File | + | − |
|---|---|---|
| src/backend/storage/buffer/bufmgr.c | 10 | 3 |
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