aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/vacuum.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/commands/vacuum.c')
-rw-r--r--src/backend/commands/vacuum.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index 7fc5c19e379..f2be74cdb5f 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -73,6 +73,15 @@ int vacuum_failsafe_age;
int vacuum_multixact_failsafe_age;
/*
+ * Variables for cost-based vacuum delay. The defaults differ between
+ * autovacuum and vacuum. They should be set with the appropriate GUC value in
+ * vacuum code. They are initialized here to the defaults for client backends
+ * executing VACUUM or ANALYZE.
+ */
+double vacuum_cost_delay = 0;
+int vacuum_cost_limit = 200;
+
+/*
* VacuumFailsafeActive is a defined as a global so that we can determine
* whether or not to re-enable cost-based vacuum delay when vacuuming a table.
* If failsafe mode has been engaged, we will not re-enable cost-based delay
@@ -514,8 +523,9 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy,
{
ListCell *cur;
+ VacuumUpdateCosts();
in_vacuum = true;
- VacuumCostActive = (VacuumCostDelay > 0);
+ VacuumCostActive = (vacuum_cost_delay > 0);
VacuumCostBalance = 0;
VacuumPageHit = 0;
VacuumPageMiss = 0;
@@ -2244,14 +2254,14 @@ vacuum_delay_point(void)
*/
if (VacuumSharedCostBalance != NULL)
msec = compute_parallel_delay();
- else if (VacuumCostBalance >= VacuumCostLimit)
- msec = VacuumCostDelay * VacuumCostBalance / VacuumCostLimit;
+ else if (VacuumCostBalance >= vacuum_cost_limit)
+ msec = vacuum_cost_delay * VacuumCostBalance / vacuum_cost_limit;
/* Nap if appropriate */
if (msec > 0)
{
- if (msec > VacuumCostDelay * 4)
- msec = VacuumCostDelay * 4;
+ if (msec > vacuum_cost_delay * 4)
+ msec = vacuum_cost_delay * 4;
pgstat_report_wait_start(WAIT_EVENT_VACUUM_DELAY);
pg_usleep(msec * 1000);
@@ -2268,8 +2278,7 @@ vacuum_delay_point(void)
VacuumCostBalance = 0;
- /* update balance values for workers */
- AutoVacuumUpdateDelay();
+ VacuumUpdateCosts();
/* Might have gotten an interrupt while sleeping */
CHECK_FOR_INTERRUPTS();
@@ -2319,11 +2328,11 @@ compute_parallel_delay(void)
/* Compute the total local balance for the current worker */
VacuumCostBalanceLocal += VacuumCostBalance;
- if ((shared_balance >= VacuumCostLimit) &&
- (VacuumCostBalanceLocal > 0.5 * ((double) VacuumCostLimit / nworkers)))
+ if ((shared_balance >= vacuum_cost_limit) &&
+ (VacuumCostBalanceLocal > 0.5 * ((double) vacuum_cost_limit / nworkers)))
{
/* Compute sleep time based on the local cost balance */
- msec = VacuumCostDelay * VacuumCostBalanceLocal / VacuumCostLimit;
+ msec = vacuum_cost_delay * VacuumCostBalanceLocal / vacuum_cost_limit;
pg_atomic_sub_fetch_u32(VacuumSharedCostBalance, VacuumCostBalanceLocal);
VacuumCostBalanceLocal = 0;
}