From: Robert Haas Date: Fri, 13 Jan 2012 13:22:31 +0000 (-0500) Subject: Fix broken logic in lazy_vacuum_heap. X-Git-Tag: REL9_2_BETA1~588 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d0dcb315db0043f10073a9a244cea138e9e60edd;p=postgresql Fix broken logic in lazy_vacuum_heap. As noted by Tom Lane, the previous coding in this area, which I introduced in commit bbb6e559c4ea0fb4c346beda76736451dc24eb4e, was poorly tested and caused the vacuum's second heap to go into what would have been an infinite loop but for the fact that it eventually caused a memory allocation failure. This version seems to work better. --- diff --git a/src/backend/commands/vacuumlazy.c b/src/backend/commands/vacuumlazy.c index 846d305d1d..2fc749e630 100644 --- a/src/backend/commands/vacuumlazy.c +++ b/src/backend/commands/vacuumlazy.c @@ -991,7 +991,11 @@ lazy_vacuum_heap(Relation onerel, LVRelStats *vacrelstats) buf = ReadBufferExtended(onerel, MAIN_FORKNUM, tblk, RBM_NORMAL, vac_strategy); if (!ConditionalLockBufferForCleanup(buf)) + { + ReleaseBuffer(buf); + ++tupindex; continue; + } tupindex = lazy_vacuum_page(onerel, tblk, buf, tupindex, vacrelstats); /* Now that we've compacted the page, record its available space */