mirror of
https://github.com/postgres/postgres.git
synced 2025-11-22 12:22:45 +03:00
Rationalize vacuuming options and parameters
We were involving the parser too much in setting up initial vacuuming parameters. This patch moves that responsibility elsewhere to simplify code, and also to make future additions easier. To do this, create a new struct VacuumParams which is filled just prior to vacuum execution, instead of at parse time; for user-invoked vacuuming this is set up in a new function ExecVacuum, while autovacuum sets it up by itself. While at it, add a new member VACOPT_SKIPTOAST to enum VacuumOption, only set by autovacuum, which is used to disable vacuuming of the toast table instead of the old do_toast parameter; this relieves the argument list of vacuum() and some callees a bit. This partially makes up for having added more arguments in an effort to avoid having autovacuum from constructing a VacuumStmt parse node. Author: Michael Paquier. Some tweaks by Álvaro Reviewed by: Robert Haas, Stephen Frost, Álvaro Herrera
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user