Skip to content

Commit 2aa6e33

Browse files
committed
Skip redundant anti-wraparound vacuums
An anti-wraparound vacuum has to be by definition aggressive as it needs to work on all the pages of a relation. However it can happen that due to some concurrent activity an anti-wraparound vacuum is marked as non-aggressive, which makes it redundant with a previous run, and it is actually useless as an anti-wraparound vacuum should process all the pages of a relation. This commit makes such vacuums to be skipped. An anti-wraparound vacuum not aggressive can be found easily by mixing low values of autovacuum_freeze_max_age (to control anti-wraparound) and autovacuum_freeze_table_age (to control the aggressiveness). 28a8fa9 has added some extra logging printing all the possible combinations of anti-wraparound and aggressive vacuums, which now gets simplified as an anti-wraparound vacuum also non-aggressive gets skipped. Per discussion mainly between Andrew Dunstan, Robert Haas, Álvaro Herrera, Kyotaro Horiguchi, Masahiko Sawada, and myself. Author: Kyotaro Horiguchi, Michael Paquier Reviewed-by: Andrew Dunstan, Álvaro Herrera Discussion: https://postgr.es/m/20180914153554.562muwr3uwujno75@alvherre.pgsql
1 parent 47b3c26 commit 2aa6e33

File tree

1 file changed

+20
-4
lines changed

1 file changed

+20
-4
lines changed

src/backend/access/heap/vacuumlazy.c

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,23 @@ heap_vacuum_rel(Relation onerel, VacuumParams *params,
248248
if (params->options & VACOPT_DISABLE_PAGE_SKIPPING)
249249
aggressive = true;
250250

251+
/*
252+
* Normally the relfrozenxid for an anti-wraparound vacuum will be old
253+
* enough to force an aggressive vacuum. However, a concurrent vacuum
254+
* might have already done this work that the relfrozenxid in relcache has
255+
* been updated. If that happens this vacuum is redundant, so skip it.
256+
*/
257+
if (params->is_wraparound && !aggressive)
258+
{
259+
ereport(DEBUG1,
260+
(errmsg("skipping redundant vacuum to prevent wraparound of table \"%s.%s.%s\"",
261+
get_database_name(MyDatabaseId),
262+
get_namespace_name(RelationGetNamespace(onerel)),
263+
RelationGetRelationName(onerel))));
264+
pgstat_progress_end_command();
265+
return;
266+
}
267+
251268
vacrelstats = (LVRelStats *) palloc0(sizeof(LVRelStats));
252269

253270
vacrelstats->old_rel_pages = onerel->rd_rel->relpages;
@@ -375,10 +392,9 @@ heap_vacuum_rel(Relation onerel, VacuumParams *params,
375392
initStringInfo(&buf);
376393
if (params->is_wraparound)
377394
{
378-
if (aggressive)
379-
msgfmt = _("automatic aggressive vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n");
380-
else
381-
msgfmt = _("automatic vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n");
395+
/* an anti-wraparound vacuum has to be aggressive */
396+
Assert(aggressive);
397+
msgfmt = _("automatic aggressive vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n");
382398
}
383399
else
384400
{

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy