]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Avoid wholesale autovacuuming when autovacuum is nominally off.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 30 Jul 2014 18:41:35 +0000 (14:41 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 30 Jul 2014 18:42:12 +0000 (14:42 -0400)
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.

src/backend/postmaster/autovacuum.c

index dd8177cc07689bedb1c0b8631f55b2b74a1f13c4..9cc56637dfd03f02a434706c09dae938275b802f 100644 (file)
@@ -2617,14 +2617,21 @@ relation_needs_vacanalyze(Oid relid,
        *wraparound = force_vacuum;
 
        /* User disabled it in pg_class.reloptions?  (But ignore if at risk) */
-       if (!force_vacuum && !av_enabled)
+       if (!av_enabled && !force_vacuum)
        {
                *doanalyze = false;
                *dovacuum = false;
                return;
        }
 
-       if (PointerIsValid(tabentry))
+       /*
+        * If we found the table in the stats hash, and autovacuum is currently
+        * enabled, make a threshold-based decision whether to vacuum and/or
+        * analyze.  If autovacuum is currently disabled, we must be here for
+        * anti-wraparound vacuuming only, so don't vacuum (or analyze) anything
+        * that's not being forced.
+        */
+       if (PointerIsValid(tabentry) && AutoVacuumingActive())
        {
                reltuples = classForm->reltuples;
                vactuples = tabentry->n_dead_tuples;