From 3cfb572dde2095df1bfc6665862dcf8ee0a95b99 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Wed, 27 Mar 2013 21:51:27 +0200 Subject: [PATCH] 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. --- src/backend/access/heap/heapam.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index fe56318887..9498cbb8a5 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -6824,7 +6824,11 @@ newt:; ItemPointerGetBlockNumber(&(xlrec->newtid)), false); if (!BufferIsValid(nbuffer)) + { + if (BufferIsValid(obuffer)) + UnlockReleaseBuffer(obuffer); return; + } page = (Page) BufferGetPage(nbuffer); if (lsn <= PageGetLSN(page)) /* changes are applied */ -- 2.40.0