Fix handling of autovacuum reloptions.
authorAlvaro Herrera
Thu, 27 Aug 2009 17:18:44 +0000 (17:18 +0000)
committerAlvaro Herrera
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 b970601b1c83616fba95b776b14e422c4b40fc6b..e0f8d55853d0d3a05c70a5fbe6808e41586dcf69 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 49b3ffa38cc384ebd29c4dae75fe39cbca253507..ea4fe65b519d523f3ea7485af5a7312c083d1202 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;