Hi,

With the new request-based pgstat reading mechanism, it is easy to fix
an autovacuum "bug".  Basically for an autovac worker the delay is
reduced, so that the data is very fresh.  Patch attached.

-- 
Alvaro Herrera                                http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.
*** src/backend/postmaster/autovacuum.c	2 Nov 2008 21:24:52 -0000	1.85
--- src/backend/postmaster/autovacuum.c	3 Nov 2008 16:39:10 -0000
***************
*** 2149,2156 ****
  		 * 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.
  		 */
  		MemoryContextSwitchTo(AutovacMemCxt);
  		tab = table_recheck_autovac(relid, table_toast_map);
--- 2149,2157 ----
  		 * It could have changed if something else processed the table while
  		 * we weren't looking.
  		 *
! 		 * 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.
  		 */
  		MemoryContextSwitchTo(AutovacMemCxt);
  		tab = table_recheck_autovac(relid, table_toast_map);
*** src/backend/postmaster/pgstat.c	3 Nov 2008 01:17:08 -0000	1.182
--- src/backend/postmaster/pgstat.c	3 Nov 2008 16:37:13 -0000
***************
*** 3389,3396 ****
  	 * 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);
  
  	/*
  	 * Loop until fresh enough stats file is available or we ran out of time.
--- 3389,3400 ----
  	 * PGSTAT_STAT_INTERVAL; and we don't want to lie to the collector about
  	 * what our cutoff time really is.
  	 */
! 	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.
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to