diff options
author | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2013-03-27 21:51:27 +0200 |
---|---|---|
committer | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2013-03-27 22:05:29 +0200 |
commit | f4ecfbcaf046845b58c551184449e8e438d44c69 (patch) | |
tree | f031fa470577923a5d6b7038f2854f477a5eb9cb | |
parent | 30de42d254d7b31161bfd0388677712694108906 (diff) |
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.
-rw-r--r-- | src/backend/access/heap/heapam.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index afe5e66b4bc..5c1edafdfd0 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -4737,7 +4737,11 @@ newt:; ItemPointerGetBlockNumber(&(xlrec->newtid)), false); if (!BufferIsValid(nbuffer)) + { + if (BufferIsValid(obuffer)) + UnlockReleaseBuffer(obuffer); return; + } page = (Page) BufferGetPage(nbuffer); if (XLByteLE(lsn, PageGetLSN(page))) /* changes are applied */ |