diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index f166509734..32bb009953 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -131,9 +131,6 @@ ExecVacuum(VacuumStmt *vacstmt, bool isTopLevel) params.multixact_freeze_table_age = -1; } - /* user-invoked vacuum is never "for wraparound" */ - params.is_wraparound = false; - /* user-invoked vacuum never uses this parameter */ params.log_min_duration = -1; @@ -1437,8 +1434,6 @@ vacuum_rel(Oid relid, RangeVar *relation, int options, VacuumParams *params) */ LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE); MyPgXact->vacuumFlags |= PROC_IN_VACUUM; - if (params->is_wraparound) - MyPgXact->vacuumFlags |= PROC_VACUUM_FOR_WRAPAROUND; LWLockRelease(ProcArrayLock); } diff --git a/src/backend/commands/vacuumlazy.c b/src/backend/commands/vacuumlazy.c index 8996d366e9..2514405c7d 100644 --- a/src/backend/commands/vacuumlazy.c +++ b/src/backend/commands/vacuumlazy.c @@ -199,6 +199,7 @@ lazy_vacuum_rel(Relation onerel, int options, VacuumParams *params, int usecs; double read_rate, write_rate; + bool anti_wraparound; /* is this vacuum to prevent wraparound */ bool aggressive; /* should we scan all unfrozen pages? */ bool scanned_all_unfrozen; /* actually scanned all such pages? */ TransactionId xidFullScanLimit; @@ -242,12 +243,24 @@ lazy_vacuum_rel(Relation onerel, int options, VacuumParams *params, * table's minimum MultiXactId is older than or equal to the requested * mxid full-table scan limit; or if DISABLE_PAGE_SKIPPING was specified. */ - aggressive = TransactionIdPrecedesOrEquals(onerel->rd_rel->relfrozenxid, + anti_wraparound = TransactionIdPrecedesOrEquals(onerel->rd_rel->relfrozenxid, xidFullScanLimit); - aggressive |= MultiXactIdPrecedesOrEquals(onerel->rd_rel->relminmxid, + anti_wraparound |= MultiXactIdPrecedesOrEquals(onerel->rd_rel->relminmxid, mxactFullScanLimit); if (options & VACOPT_DISABLE_PAGE_SKIPPING) aggressive = true; + else + aggressive = anti_wraparound; + + /* + * If this is an anti-wraparound vacuum, prevent it from being killed by + * the deadlock detector. + */ + if (anti_wraparound && IsAutoVacuumWorkerProcess()) { + LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE); + MyPgXact->vacuumFlags |= PROC_VACUUM_FOR_WRAPAROUND; + LWLockRelease(ProcArrayLock); + } vacrelstats = (LVRelStats *) palloc0(sizeof(LVRelStats)); @@ -261,6 +274,23 @@ lazy_vacuum_rel(Relation onerel, int options, VacuumParams *params, vac_open_indexes(onerel, RowExclusiveLock, &nindexes, &Irel); vacrelstats->hasindex = (nindexes > 0); + /* Report status. Autovac status is handled below. */ + if (!IsAutoVacuumWorkerProcess()) { + char *msgfmt; + + if (anti_wraparound) + msgfmt = _("vacuuming to prevent wraparound of table \"%s.%s\""); + else if (aggressive) + msgfmt = _("vacuuming \"%s.%s\" without page skipping"); + else + msgfmt = _("vacuuming \"%s.%s\""); + + ereport(elevel, + (errmsg(msgfmt, + get_namespace_name(RelationGetNamespace(onerel)), + RelationGetRelationName(onerel)))); + } + /* Do the vacuuming */ lazy_scan_heap(onerel, options, vacrelstats, Irel, nindexes, aggressive); @@ -374,20 +404,11 @@ lazy_vacuum_rel(Relation onerel, int options, VacuumParams *params, * emitting individual parts of the message when not applicable. */ initStringInfo(&buf); - if (params->is_wraparound) - { - if (aggressive) - msgfmt = _("automatic aggressive vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n"); - else - msgfmt = _("automatic vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n"); - } + if (anti_wraparound) + msgfmt = _("automatic vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n"); else - { - if (aggressive) - msgfmt = _("automatic aggressive vacuum of table \"%s.%s.%s\": index scans: %d\n"); - else - msgfmt = _("automatic vacuum of table \"%s.%s.%s\": index scans: %d\n"); - } + /* An autovacuum can't be just aggressive; it's either anti-wraparound or normal. */ + msgfmt = _("automatic vacuum of table \"%s.%s.%s\": index scans: %d\n"); appendStringInfo(&buf, msgfmt, get_database_name(MyDatabaseId), get_namespace_name(RelationGetNamespace(onerel)), @@ -505,16 +526,6 @@ lazy_scan_heap(Relation onerel, int options, LVRelStats *vacrelstats, pg_rusage_init(&ru0); relname = RelationGetRelationName(onerel); - if (aggressive) - ereport(elevel, - (errmsg("aggressively vacuuming \"%s.%s\"", - get_namespace_name(RelationGetNamespace(onerel)), - relname))); - else - ereport(elevel, - (errmsg("vacuuming \"%s.%s\"", - get_namespace_name(RelationGetNamespace(onerel)), - relname))); empty_pages = vacuumed_pages = 0; next_fsm_block_to_vacuum = (BlockNumber) 0; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index 5af96fdc8a..e07a90f164 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -142,7 +142,6 @@ typedef struct VacuumParams * use default */ int multixact_freeze_table_age; /* multixact age at which to scan * whole table */ - bool is_wraparound; /* force a for-wraparound vacuum */ int log_min_duration; /* minimum execution threshold in ms at * which verbose logs are activated, -1 * to use default */