From 53af86c55c1634d1ec7c9f6fefec5cf591967bc5 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Thu, 27 Aug 2009 17:18:44 +0000 Subject: [PATCH] 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 --- src/backend/access/common/reloptions.c | 20 +++--- src/backend/postmaster/autovacuum.c | 86 ++++++++++++++------------ 2 files changed, 57 insertions(+), 49 deletions(-) diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c index b970601b1c..e0f8d55853 100644 --- a/src/backend/access/common/reloptions.c +++ b/src/backend/access/common/reloptions.c @@ -8,7 +8,7 @@ * * * 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", 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", 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", 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", 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", 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", RELOPT_KIND_HEAP | RELOPT_KIND_TOAST }, - 200000000, 100000000, 2000000000 + -1, 100000000, 2000000000 }, { { "autovacuum_freeze_table_age", "Age at which VACUUM should perform a full table sweep to replace old Xid values with FrozenXID", RELOPT_KIND_HEAP | RELOPT_KIND_TOAST - }, 150000000, 0, 2000000000 + }, -1, 0, 2000000000 }, /* list terminator */ {{NULL}} @@ -169,7 +169,7 @@ static relopt_real realRelOpts[] = "Number of tuple updates or deletes prior to vacuum as a fraction of reltuples", 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", RELOPT_KIND_HEAP | RELOPT_KIND_TOAST }, - 0.1, 0.0, 100.0 + -1, 0.0, 100.0 }, /* list terminator */ {{NULL}} diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 49b3ffa38c..ea4fe65b51 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -55,7 +55,7 @@ * * * 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 * defaults, autovacuum's own first and plain vacuum second. */ - if (avopts) - { - vac_cost_delay = avopts->vacuum_cost_delay; - vac_cost_limit = avopts->vacuum_cost_limit; - freeze_min_age = avopts->freeze_min_age; - freeze_table_age = avopts->freeze_table_age; - } - else - { - /* -1 in autovac setting means use plain vacuum_cost_delay */ - vac_cost_delay = autovacuum_vac_cost_delay >= 0 ? - autovacuum_vac_cost_delay : VacuumCostDelay; - /* 0 or -1 in autovac setting means use plain vacuum_cost_limit */ - vac_cost_limit = autovacuum_vac_cost_limit > 0 ? - autovacuum_vac_cost_limit : VacuumCostLimit; - /* these do not have autovacuum-specific settings */ - freeze_min_age = default_freeze_min_age; - freeze_table_age = default_freeze_table_age; - } + + /* -1 in autovac setting means use plain vacuum_cost_delay */ + vac_cost_delay = (avopts && avopts->vacuum_cost_delay >= 0) + ? avopts->vacuum_cost_delay + : (autovacuum_vac_cost_delay >= 0) + ? autovacuum_vac_cost_delay + : VacuumCostDelay; + + /* 0 or -1 in autovac setting means use plain vacuum_cost_limit */ + vac_cost_limit = (avopts && avopts->vacuum_cost_limit > 0) + ? avopts->vacuum_cost_limit + : (autovacuum_vac_cost_limit > 0) + ? autovacuum_vac_cost_limit + : VacuumCostLimit; + + /* these do not have autovacuum-specific settings */ + freeze_min_age = (avopts && avopts->freeze_min_age >= 0) + ? 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->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 * table), or the autovacuum GUC variables. */ - if (relopts) - { - vac_scale_factor = relopts->vacuum_scale_factor; - vac_base_thresh = relopts->vacuum_threshold; - anl_scale_factor = relopts->analyze_scale_factor; - anl_base_thresh = relopts->analyze_threshold; - freeze_max_age = Min(relopts->freeze_max_age, - autovacuum_freeze_max_age); - av_enabled = relopts->enabled; - } - else - { - vac_scale_factor = autovacuum_vac_scale; - vac_base_thresh = autovacuum_vac_thresh; - anl_scale_factor = autovacuum_anl_scale; - anl_base_thresh = autovacuum_anl_thresh; - freeze_max_age = autovacuum_freeze_max_age; - av_enabled = true; - } + + /* -1 in autovac setting means use plain vacuum_cost_delay */ + vac_scale_factor = (relopts && relopts->vacuum_scale_factor >= 0) + ? relopts->vacuum_scale_factor + : autovacuum_vac_scale; + + vac_base_thresh = (relopts && relopts->vacuum_threshold >= 0) + ? relopts->vacuum_threshold + : autovacuum_vac_thresh; + + anl_scale_factor = (relopts && relopts->analyze_scale_factor >= 0) + ? relopts->analyze_scale_factor + : autovacuum_anl_scale; + + anl_base_thresh = (relopts && relopts->analyze_threshold >= 0) + ? relopts->analyze_threshold + : autovacuum_anl_thresh; + + 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 */ xidForceLimit = recentXid - freeze_max_age; -- 2.40.0