]> granicus.if.org Git - postgresql/commitdiff
Reduce the acceptable staleness of pgstat data for autovacuum, per the
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Mon, 3 Nov 2008 19:03:41 +0000 (19:03 +0000)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Mon, 3 Nov 2008 19:03:41 +0000 (19:03 +0000)
longstanding note in the source that this patch removes.

src/backend/postmaster/autovacuum.c
src/backend/postmaster/pgstat.c

index 6f056e0e16904a9a004c525960f2d32a21a92e6d..fd1489947f002cefaad73ba2ff98942d8c4d47fa 100644 (file)
@@ -55,7 +55,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/postmaster/autovacuum.c,v 1.85 2008/11/02 21:24:52 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/postmaster/autovacuum.c,v 1.86 2008/11/03 19:03:41 alvherre Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -2149,8 +2149,10 @@ do_autovacuum(void)
                 * It could have changed if something else processed the table while
                 * we weren't looking.
                 *
-                * FIXME we ignore the possibility that the table was finished being
-                * vacuumed in the last 500ms (PGSTAT_STAT_INTERVAL).  This is a bug.
+                * Note: we have a special case in pgstat code to ensure that the stats
+                * we read are as up-to-date as possible, to avoid the problem that
+                * somebody just finished vacuuming this table.  The window to the race
+                * condition is not closed but it is very small.
                 */
                MemoryContextSwitchTo(AutovacMemCxt);
                tab = table_recheck_autovac(relid, table_toast_map);
index d3455cee1924a133afc6caafa2e9f5ab464fe06e..8fcd5f46949a53cae4f6f43e17d7d76b8794d5f7 100644 (file)
@@ -13,7 +13,7 @@
  *
  *     Copyright (c) 2001-2008, PostgreSQL Global Development Group
  *
- *     $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.182 2008/11/03 01:17:08 tgl Exp $
+ *     $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.183 2008/11/03 19:03:41 alvherre Exp $
  * ----------
  */
 #include "postgres.h"
@@ -3381,7 +3381,10 @@ backend_read_statsfile(void)
        /*
         * We set the minimum acceptable timestamp to PGSTAT_STAT_INTERVAL msec
         * before now.  This indirectly ensures that the collector needn't write
-        * the file more often than PGSTAT_STAT_INTERVAL.
+        * the file more often than PGSTAT_STAT_INTERVAL.  In an autovacuum
+        * worker, however, we want a lower delay to avoid using stale data, so we
+        * use PGSTAT_RETRY_DELAY (since the number of worker is low, this
+        * shouldn't be a problem).
         *
         * Note that we don't recompute min_ts after sleeping; so we might end up
         * accepting a file a bit older than PGSTAT_STAT_INTERVAL.  In practice
@@ -3389,8 +3392,12 @@ backend_read_statsfile(void)
         * PGSTAT_STAT_INTERVAL; and we don't want to lie to the collector about
         * what our cutoff time really is.
         */
-       min_ts = TimestampTzPlusMilliseconds(GetCurrentTimestamp(),
-                                                                                -PGSTAT_STAT_INTERVAL);
+       if (IsAutoVacuumWorkerProcess())
+               min_ts = TimestampTzPlusMilliseconds(GetCurrentTimestamp(),
+                                                                                        -PGSTAT_RETRY_DELAY);
+       else
+               min_ts = TimestampTzPlusMilliseconds(GetCurrentTimestamp(),
+                                                                                        -PGSTAT_STAT_INTERVAL);
 
        /*
         * Loop until fresh enough stats file is available or we ran out of time.