Skip to content

Commit f4ecfbc

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 30de42d commit f4ecfbc

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
@@ -4737,7 +4737,11 @@ newt:;
47374737
ItemPointerGetBlockNumber(&(xlrec->newtid)),
47384738
false);
47394739
if (!BufferIsValid(nbuffer))
4740+
{
4741+
if (BufferIsValid(obuffer))
4742+
UnlockReleaseBuffer(obuffer);
47404743
return;
4744+
}
47414745
page = (Page) BufferGetPage(nbuffer);
47424746

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

0 commit comments

Comments
 (0)