diff options
Diffstat (limited to 'src/backend/postmaster/autovacuum.c')
-rw-r--r-- | src/backend/postmaster/autovacuum.c | 58 |
1 files changed, 19 insertions, 39 deletions
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index ee556f3600d..5ccae24b25c 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -184,16 +184,11 @@ typedef struct av_relation typedef struct autovac_table { Oid at_relid; - bool at_dovacuum; - bool at_doanalyze; - int at_freeze_min_age; - int at_freeze_table_age; - int at_multixact_freeze_min_age; - int at_multixact_freeze_table_age; + int at_vacoptions; /* bitmask of VacuumOption */ + VacuumParams at_params; int at_vacuum_cost_delay; int at_vacuum_cost_limit; bool at_dobalance; - bool at_wraparound; char *at_relname; char *at_nspname; char *at_datname; @@ -2301,7 +2296,7 @@ do_autovacuum(void) * next table in our list. */ HOLD_INTERRUPTS(); - if (tab->at_dovacuum) + if (tab->at_vacoptions & VACOPT_VACUUM) errcontext("automatic vacuum of table \"%s.%s.%s\"", tab->at_datname, tab->at_nspname, tab->at_relname); else @@ -2528,15 +2523,17 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab = palloc(sizeof(autovac_table)); tab->at_relid = relid; - tab->at_dovacuum = dovacuum; - tab->at_doanalyze = doanalyze; - tab->at_freeze_min_age = freeze_min_age; - tab->at_freeze_table_age = freeze_table_age; - tab->at_multixact_freeze_min_age = multixact_freeze_min_age; - tab->at_multixact_freeze_table_age = multixact_freeze_table_age; + tab->at_vacoptions = VACOPT_SKIPTOAST | + (dovacuum ? VACOPT_VACUUM : 0) | + (doanalyze ? VACOPT_ANALYZE : 0) | + (wraparound ? VACOPT_NOWAIT : 0); + tab->at_params.freeze_min_age = freeze_min_age; + tab->at_params.freeze_table_age = freeze_table_age; + tab->at_params.multixact_freeze_min_age = multixact_freeze_min_age; + tab->at_params.multixact_freeze_table_age = multixact_freeze_table_age; + tab->at_params.is_wraparound = wraparound; tab->at_vacuum_cost_limit = vac_cost_limit; tab->at_vacuum_cost_delay = vac_cost_delay; - tab->at_wraparound = wraparound; tab->at_relname = NULL; tab->at_nspname = NULL; tab->at_datname = NULL; @@ -2737,39 +2734,22 @@ relation_needs_vacanalyze(Oid relid, * Vacuum and/or analyze the specified table */ static void -autovacuum_do_vac_analyze(autovac_table *tab, - BufferAccessStrategy bstrategy) +autovacuum_do_vac_analyze(autovac_table *tab, BufferAccessStrategy bstrategy) { - VacuumStmt vacstmt; - RangeVar rangevar; + RangeVar rangevar; /* Set up command parameters --- use local variables instead of palloc */ - MemSet(&vacstmt, 0, sizeof(vacstmt)); MemSet(&rangevar, 0, sizeof(rangevar)); rangevar.schemaname = tab->at_nspname; rangevar.relname = tab->at_relname; rangevar.location = -1; - vacstmt.type = T_VacuumStmt; - if (!tab->at_wraparound) - vacstmt.options = VACOPT_NOWAIT; - if (tab->at_dovacuum) - vacstmt.options |= VACOPT_VACUUM; - if (tab->at_doanalyze) - vacstmt.options |= VACOPT_ANALYZE; - vacstmt.freeze_min_age = tab->at_freeze_min_age; - vacstmt.freeze_table_age = tab->at_freeze_table_age; - vacstmt.multixact_freeze_min_age = tab->at_multixact_freeze_min_age; - vacstmt.multixact_freeze_table_age = tab->at_multixact_freeze_table_age; - /* we pass the OID, but might need this anyway for an error message */ - vacstmt.relation = &rangevar; - vacstmt.va_cols = NIL; - /* Let pgstat know what we're doing */ autovac_report_activity(tab); - vacuum(&vacstmt, tab->at_relid, false, bstrategy, tab->at_wraparound, true); + vacuum(tab->at_vacoptions, &rangevar, tab->at_relid, &tab->at_params, NIL, + bstrategy, true); } /* @@ -2791,10 +2771,10 @@ autovac_report_activity(autovac_table *tab) int len; /* Report the command and possible options */ - if (tab->at_dovacuum) + if (tab->at_vacoptions & VACOPT_VACUUM) snprintf(activity, MAX_AUTOVAC_ACTIV_LEN, "autovacuum: VACUUM%s", - tab->at_doanalyze ? " ANALYZE" : ""); + tab->at_vacoptions & VACOPT_ANALYZE ? " ANALYZE" : ""); else snprintf(activity, MAX_AUTOVAC_ACTIV_LEN, "autovacuum: ANALYZE"); @@ -2806,7 +2786,7 @@ autovac_report_activity(autovac_table *tab) snprintf(activity + len, MAX_AUTOVAC_ACTIV_LEN - len, " %s.%s%s", tab->at_nspname, tab->at_relname, - tab->at_wraparound ? " (to prevent wraparound)" : ""); + tab->at_params.is_wraparound ? " (to prevent wraparound)" : ""); /* Set statement_timestamp() to current time for pg_stat_activity */ SetCurrentStatementStartTimestamp(); |