From 88dd4b0a0d3d12605ded082e85693c7f0b5c4c2d Mon Sep 17 00:00:00 2001 From: Alvaro Herrera <alvherre@alvh.no-ip.org> Date: Mon, 3 Nov 2008 19:03:41 +0000 Subject: [PATCH] Reduce the acceptable staleness of pgstat data for autovacuum, per the longstanding note in the source that this patch removes. --- src/backend/postmaster/autovacuum.c | 8 +++++--- src/backend/postmaster/pgstat.c | 15 +++++++++++---- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 6f056e0e169..fd1489947f0 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -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); diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index d3455cee192..8fcd5f46949 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -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. -- GitLab