mirror of
https://github.com/postgres/postgres.git
synced 2025-05-02 11:44:50 +03:00
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 3bbf668de9f1bc172371681e80a4e769b6d014c8 (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.
This commit is contained in:
parent
96103c6a0f
commit
1b315c5391
@ -5367,7 +5367,11 @@ newt:;
|
|||||||
ItemPointerGetBlockNumber(&(xlrec->newtid)),
|
ItemPointerGetBlockNumber(&(xlrec->newtid)),
|
||||||
false);
|
false);
|
||||||
if (!BufferIsValid(nbuffer))
|
if (!BufferIsValid(nbuffer))
|
||||||
|
{
|
||||||
|
if (BufferIsValid(obuffer))
|
||||||
|
UnlockReleaseBuffer(obuffer);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
page = (Page) BufferGetPage(nbuffer);
|
page = (Page) BufferGetPage(nbuffer);
|
||||||
|
|
||||||
if (XLByteLE(lsn, PageGetLSN(page))) /* changes are applied */
|
if (XLByteLE(lsn, PageGetLSN(page))) /* changes are applied */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user