diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c index 8f14cf85f3..343500dbe2 100644 --- a/src/backend/access/heap/vacuumlazy.c +++ b/src/backend/access/heap/vacuumlazy.c @@ -2637,7 +2637,8 @@ lazy_check_wraparound_failsafe(LVRelState *vacrel) "You might also need to consider other ways for VACUUM to keep up with the allocation of transaction IDs."))); /* Stop applying cost limits from this point on */ - VacuumCostActive = false; + VacuumCostActiveForceDisable = true; + SetVacuumCostActive(false); VacuumCostBalance = 0; return true; diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index c54360a6a0..f78219bd1e 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -491,7 +491,7 @@ vacuum(List *relations, VacuumParams *params, ListCell *cur; in_vacuum = true; - VacuumCostActive = (VacuumCostDelay > 0); + SetVacuumCostActive(VacuumCostDelay > 0); VacuumCostBalance = 0; VacuumPageHit = 0; VacuumPageMiss = 0; @@ -549,7 +549,7 @@ vacuum(List *relations, VacuumParams *params, PG_FINALLY(); { in_vacuum = false; - VacuumCostActive = false; + SetVacuumCostActive(false); } PG_END_TRY(); diff --git a/src/backend/commands/vacuumparallel.c b/src/backend/commands/vacuumparallel.c index bcd40c80a1..47e0c2c354 100644 --- a/src/backend/commands/vacuumparallel.c +++ b/src/backend/commands/vacuumparallel.c @@ -990,7 +990,7 @@ parallel_vacuum_main(dsm_segment *seg, shm_toc *toc) false); /* Set cost-based vacuum delay */ - VacuumCostActive = (VacuumCostDelay > 0); + SetVacuumCostActive(VacuumCostDelay > 0); VacuumCostBalance = 0; VacuumPageHit = 0; VacuumPageMiss = 0; diff --git a/src/backend/utils/init/globals.c b/src/backend/utils/init/globals.c index 1b1d814254..1191a39618 100644 --- a/src/backend/utils/init/globals.c +++ b/src/backend/utils/init/globals.c @@ -150,4 +150,13 @@ int64 VacuumPageMiss = 0; int64 VacuumPageDirty = 0; int VacuumCostBalance = 0; /* working state for vacuum */ -bool VacuumCostActive = false; +bool VacuumCostActive = false; /* should be set using SetVacuumCostActive() */ +bool VacuumCostActiveForceDisable = false; + +/* Set VacuumCostActive following VacuumCostActiveForceDisable */ +void +SetVacuumCostActive(bool value) +{ + VacuumCostActive = value && !VacuumCostActiveForceDisable; +} + diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h index 06a86f9ac1..97fa3896c0 100644 --- a/src/include/miscadmin.h +++ b/src/include/miscadmin.h @@ -275,7 +275,9 @@ extern PGDLLIMPORT int64 VacuumPageDirty; extern PGDLLIMPORT int VacuumCostBalance; extern PGDLLIMPORT bool VacuumCostActive; +extern PGDLLIMPORT bool VacuumCostActiveForceDisable; +extern void SetVacuumCostActive(bool value); /* in tcop/postgres.c */