mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-21 08:29:39 +08:00
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:
parent
8f5500e6bd
commit
53af86c55c
@ -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}}
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user