8000 Fix buffer pin leak in heap update redo routine. · commandprompt/postgres@336e493 · GitHub
[go: up one dir, main page]

Skip to content

Commit 336e493

Browse files
committed
Fix buffer pin leak in heap update redo routine.
In a heap update, if the old and new tuple were on different pages, and the new page no longer existed (because it was subsequently truncated away by vacuum), heap_xlog_update forgot to release the pin on the old buffer. This bug was introduced by the "Fix multiple problems in WAL replay" patch, commit 3bbf668 (on master branch). With full_page_writes=off, this triggered an "incorrect local pin count" error later in replay, if the old page was vacuumed. This fixes bug #7969, reported by Yunong Xiao. Backpatch to 9.0, like the commit that introduced this bug.
1 parent f4428cc commit 336e493

File tree

1 file changed

+4
-0
lines changed

1 file changed

+4
-0
lines changed

src/backend/access/heap/heapam.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4670,7 +4670,11 @@ newt:;
46704670
ItemPointerGetBlockNumber(&(xlrec->newtid)),
46714671
false);
46724672
if (!BufferIsValid(nbuffer))
4673+
{
4674+
if (BufferIsValid(obuffer))
4675+
UnlockReleaseBuffer(obuffer);
46734676
return;
4677+
}
46744678
page = (Page) BufferGetPage(nbuffer);
46754679

46764680
if (XLByteLE(lsn, PageGetLSN(page))) /* changes are applied */

0 commit comments

Comments
 (0)
0