Fix logic in lazy vacuum to decide if it's worth trying to truncate the heap.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Tue, 6 Jan 2009 14:56:13 +0000 (14:56 +0000)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Tue, 6 Jan 2009 14:56:13 +0000 (14:56 +0000)
If the table was smaller than REL_TRUNCATE_FRACTION (= 16) pages, we always
tried to acquire AccessExclusiveLock on it even if there was no empty pages
at the end.

Report by Simon Riggs. Back-patch all the way to 7.4.

src/backend/commands/vacuumlazy.c

index 732c6d4bf9fc0623b644a223ebfd9746d0cba22e..d7daf1ba3c93af85993b96977a4853c06fe7d25f 100644 (file)
@@ -31,7 +31,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/commands/vacuumlazy.c,v 1.32.2.2 2007/09/16 02:38:25 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/commands/vacuumlazy.c,v 1.32.2.3 2009/01/06 14:56:13 heikki Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -161,8 +161,9 @@ lazy_vacuum_rel(Relation onerel, VacuumStmt *vacstmt)
     * number of pages.  Otherwise, the time taken isn't worth it.
     */
    possibly_freeable = vacrelstats->rel_pages - vacrelstats->nonempty_pages;
-   if (possibly_freeable >= REL_TRUNCATE_MINIMUM ||
-    possibly_freeable >= vacrelstats->rel_pages / REL_TRUNCATE_FRACTION)
+   if (possibly_freeable > 0 &&
+       (possibly_freeable >= REL_TRUNCATE_MINIMUM ||
+        possibly_freeable >= vacrelstats->rel_pages / REL_TRUNCATE_FRACTION))
        lazy_truncate_heap(onerel, vacrelstats);
 
    /* Update shared free space map with final free space info */