Skip to content

Commit c83aed3

Browse files
committed
Avoid wholesale autovacuuming when autovacuum is nominally off.
When autovacuum is nominally off, we will still launch autovac workers to vacuum tables that are at risk of XID wraparound. But after we'd done that, an autovac worker would proceed to autovacuum every table in the targeted database, if they meet the usual thresholds for autovacuuming. This is at best pretty unexpected; at worst it delays response to the wraparound threat. Fix it so that if autovacuum is nominally off, we *only* do forced vacuums and not any other work. Per gripe from Andrey Zhidenkov. This has been like this all along, so back-patch to all supported branches.
1 parent 1578d13 commit c83aed3

File tree

1 file changed

+9
-2
lines changed

1 file changed

+9
-2
lines changed

src/backend/postmaster/autovacuum.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2660,14 +2660,21 @@ relation_needs_vacanalyze(Oid relid,
26602660
*wraparound = force_vacuum;
26612661

26622662
/* User disabled it in pg_class.reloptions? (But ignore if at risk) */
2663-
if (!force_vacuum && !av_enabled)
2663+
if (!av_enabled && !force_vacuum)
26642664
{
26652665
*doanalyze = false;
26662666
*dovacuum = false;
26672667
return;
26682668
}
26692669

2670-
if (PointerIsValid(tabentry))
2670+
/*
2671+
* If we found the table in the stats hash, and autovacuum is currently
2672+
* enabled, make a threshold-based decision whether to vacuum and/or
2673+
* analyze. If autovacuum is currently disabled, we must be here for
2674+
* anti-wraparound vacuuming only, so don't vacuum (or analyze) anything
2675+
* that's not being forced.
2676+
*/
2677+
if (PointerIsValid(tabentry) && AutoVacuumingActive())
26712678
{
26722679
reltuples = classForm->reltuples;
26732680
vactuples = tabentry->n_dead_tuples;

0 commit comments

Comments
 (0)