OSDN Git Service

Fix handling of autovacuum reloptions.
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Thu, 27 Aug 2009 17:18:44 +0000 (17:18 +0000)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Thu, 27 Aug 2009 17:18:44 +0000 (17:18 +0000)
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
src/backend/postmaster/autovacuum.c

index b970601..e0f8d55 100644 (file)
@@ -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}}
index 49b3ffa..ea4fe65 100644 (file)
@@ -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;