Fix handling of autovacuum reloptions.

In the original coding, setting a single reloption would cause default
values to be used for all the other reloptions.  This is a problem
particularly for autovacuum reloptions.

Itagaki Takahiro
This commit is contained in:
Alvaro Herrera 2009-08-27 17:18:44 +00:00
parent 8f5500e6bd
commit 53af86c55c
2 changed files with 57 additions and 49 deletions

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/access/common/reloptions.c,v 1.28 2009/06/11 14:48:53 momjian Exp $ * $PostgreSQL: pgsql/src/backend/access/common/reloptions.c,v 1.29 2009/08/27 17:18:44 alvherre Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -108,7 +108,7 @@ static relopt_int intRelOpts[] =
"Minimum number of tuple updates or deletes prior to vacuum", "Minimum number of tuple updates or deletes prior to vacuum",
RELOPT_KIND_HEAP | RELOPT_KIND_TOAST RELOPT_KIND_HEAP | RELOPT_KIND_TOAST
}, },
50, 0, INT_MAX -1, 0, INT_MAX
}, },
{ {
{ {
@ -116,7 +116,7 @@ static relopt_int intRelOpts[] =
"Minimum number of tuple inserts, updates or deletes prior to analyze", "Minimum number of tuple inserts, updates or deletes prior to analyze",
RELOPT_KIND_HEAP | RELOPT_KIND_TOAST RELOPT_KIND_HEAP | RELOPT_KIND_TOAST
}, },
50, 0, INT_MAX -1, 0, INT_MAX
}, },
{ {
{ {
@ -124,7 +124,7 @@ static relopt_int intRelOpts[] =
"Vacuum cost delay in milliseconds, for autovacuum", "Vacuum cost delay in milliseconds, for autovacuum",
RELOPT_KIND_HEAP | RELOPT_KIND_TOAST RELOPT_KIND_HEAP | RELOPT_KIND_TOAST
}, },
20, 0, 100 -1, 0, 100
}, },
{ {
{ {
@ -132,7 +132,7 @@ static relopt_int intRelOpts[] =
"Vacuum cost amount available before napping, for autovacuum", "Vacuum cost amount available before napping, for autovacuum",
RELOPT_KIND_HEAP | RELOPT_KIND_TOAST RELOPT_KIND_HEAP | RELOPT_KIND_TOAST
}, },
200, 1, 10000 -1, 1, 10000
}, },
{ {
{ {
@ -140,7 +140,7 @@ static relopt_int intRelOpts[] =
"Minimum age at which VACUUM should freeze a table row, for autovacuum", "Minimum age at which VACUUM should freeze a table row, for autovacuum",
RELOPT_KIND_HEAP | RELOPT_KIND_TOAST RELOPT_KIND_HEAP | RELOPT_KIND_TOAST
}, },
100000000, 0, 1000000000 -1, 0, 1000000000
}, },
{ {
{ {
@ -148,14 +148,14 @@ static relopt_int intRelOpts[] =
"Age at which to autovacuum a table to prevent transaction ID wraparound", "Age at which to autovacuum a table to prevent transaction ID wraparound",
RELOPT_KIND_HEAP | RELOPT_KIND_TOAST RELOPT_KIND_HEAP | RELOPT_KIND_TOAST
}, },
200000000, 100000000, 2000000000 -1, 100000000, 2000000000
}, },
{ {
{ {
"autovacuum_freeze_table_age", "autovacuum_freeze_table_age",
"Age at which VACUUM should perform a full table sweep to replace old Xid values with FrozenXID", "Age at which VACUUM should perform a full table sweep to replace old Xid values with FrozenXID",
RELOPT_KIND_HEAP | RELOPT_KIND_TOAST RELOPT_KIND_HEAP | RELOPT_KIND_TOAST
}, 150000000, 0, 2000000000 }, -1, 0, 2000000000
}, },
/* list terminator */ /* list terminator */
{{NULL}} {{NULL}}
@ -169,7 +169,7 @@ static relopt_real realRelOpts[] =
"Number of tuple updates or deletes prior to vacuum as a fraction of reltuples", "Number of tuple updates or deletes prior to vacuum as a fraction of reltuples",
RELOPT_KIND_HEAP | RELOPT_KIND_TOAST RELOPT_KIND_HEAP | RELOPT_KIND_TOAST
}, },
0.2, 0.0, 100.0 -1, 0.0, 100.0
}, },
{ {
{ {
@ -177,7 +177,7 @@ static relopt_real realRelOpts[] =
"Number of tuple inserts, updates or deletes prior to analyze as a fraction of reltuples", "Number of tuple inserts, updates or deletes prior to analyze as a fraction of reltuples",
RELOPT_KIND_HEAP | RELOPT_KIND_TOAST RELOPT_KIND_HEAP | RELOPT_KIND_TOAST
}, },
0.1, 0.0, 100.0 -1, 0.0, 100.0
}, },
/* list terminator */ /* list terminator */
{{NULL}} {{NULL}}

View File

@ -55,7 +55,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/postmaster/autovacuum.c,v 1.102 2009/08/24 17:23:02 alvherre Exp $ * $PostgreSQL: pgsql/src/backend/postmaster/autovacuum.c,v 1.103 2009/08/27 17:18:44 alvherre Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -2448,25 +2448,29 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map,
* toast table, try the main table too. Otherwise use the GUC * toast table, try the main table too. Otherwise use the GUC
* defaults, autovacuum's own first and plain vacuum second. * defaults, autovacuum's own first and plain vacuum second.
*/ */
if (avopts)
{ /* -1 in autovac setting means use plain vacuum_cost_delay */
vac_cost_delay = avopts->vacuum_cost_delay; vac_cost_delay = (avopts && avopts->vacuum_cost_delay >= 0)
vac_cost_limit = avopts->vacuum_cost_limit; ? avopts->vacuum_cost_delay
freeze_min_age = avopts->freeze_min_age; : (autovacuum_vac_cost_delay >= 0)
freeze_table_age = avopts->freeze_table_age; ? autovacuum_vac_cost_delay
} : VacuumCostDelay;
else
{ /* 0 or -1 in autovac setting means use plain vacuum_cost_limit */
/* -1 in autovac setting means use plain vacuum_cost_delay */ vac_cost_limit = (avopts && avopts->vacuum_cost_limit > 0)
vac_cost_delay = autovacuum_vac_cost_delay >= 0 ? ? avopts->vacuum_cost_limit
autovacuum_vac_cost_delay : VacuumCostDelay; : (autovacuum_vac_cost_limit > 0)
/* 0 or -1 in autovac setting means use plain vacuum_cost_limit */ ? autovacuum_vac_cost_limit
vac_cost_limit = autovacuum_vac_cost_limit > 0 ? : VacuumCostLimit;
autovacuum_vac_cost_limit : VacuumCostLimit;
/* these do not have autovacuum-specific settings */ /* these do not have autovacuum-specific settings */
freeze_min_age = default_freeze_min_age; freeze_min_age = (avopts && avopts->freeze_min_age >= 0)
freeze_table_age = default_freeze_table_age; ? avopts->freeze_min_age
} : default_freeze_min_age;
freeze_table_age = (avopts && avopts->freeze_table_age >= 0)
? avopts->freeze_table_age
: default_freeze_table_age;
tab = palloc(sizeof(autovac_table)); tab = palloc(sizeof(autovac_table));
tab->at_relid = relid; tab->at_relid = relid;
@ -2563,25 +2567,29 @@ relation_needs_vacanalyze(Oid relid,
* sources: the passed reloptions (which could be a main table or a toast * sources: the passed reloptions (which could be a main table or a toast
* table), or the autovacuum GUC variables. * table), or the autovacuum GUC variables.
*/ */
if (relopts)
{ /* -1 in autovac setting means use plain vacuum_cost_delay */
vac_scale_factor = relopts->vacuum_scale_factor; vac_scale_factor = (relopts && relopts->vacuum_scale_factor >= 0)
vac_base_thresh = relopts->vacuum_threshold; ? relopts->vacuum_scale_factor
anl_scale_factor = relopts->analyze_scale_factor; : autovacuum_vac_scale;
anl_base_thresh = relopts->analyze_threshold;
freeze_max_age = Min(relopts->freeze_max_age, vac_base_thresh = (relopts && relopts->vacuum_threshold >= 0)
autovacuum_freeze_max_age); ? relopts->vacuum_threshold
av_enabled = relopts->enabled; : autovacuum_vac_thresh;
}
else anl_scale_factor = (relopts && relopts->analyze_scale_factor >= 0)
{ ? relopts->analyze_scale_factor
vac_scale_factor = autovacuum_vac_scale; : autovacuum_anl_scale;
vac_base_thresh = autovacuum_vac_thresh;
anl_scale_factor = autovacuum_anl_scale; anl_base_thresh = (relopts && relopts->analyze_threshold >= 0)
anl_base_thresh = autovacuum_anl_thresh; ? relopts->analyze_threshold
freeze_max_age = autovacuum_freeze_max_age; : autovacuum_anl_thresh;
av_enabled = true;
} freeze_max_age = (relopts && relopts->freeze_max_age >= 0)
? Min(relopts->freeze_max_age, autovacuum_freeze_max_age)
: autovacuum_freeze_max_age;
av_enabled = (relopts ? relopts->enabled : true);
/* Force vacuum if table is at risk of wraparound */ /* Force vacuum if table is at risk of wraparound */
xidForceLimit = recentXid - freeze_max_age; xidForceLimit = recentXid - freeze_max_age;