Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Fix the usage of parallel and full options of vacuum command.
authorAmit Kapila <akapila@postgresql.org>
Thu, 16 Apr 2020 05:14:03 +0000 (10:44 +0530)
committerAmit Kapila <akapila@postgresql.org>
Thu, 16 Apr 2020 05:25:02 +0000 (10:55 +0530)
Earlier we were inconsistent in allowing the usage of parallel and
full options.  Change it such that we disallow them only when they are
combined in a way that we don't support.

In passing, improve the comments in some of the existing tests of parallel
vacuum.

Reported-by: Tushar Ahuja
Author: Justin Pryzby, Amit Kapila
Reviewed-by: Sawada Masahiko, Michael Paquier, Mahendra Singh Thalor and
Amit Kapila
Discussion: https://postgr.es/m/58c8d171-e665-6fa3-a9d3-d9423b694dae%40enterprisedb.com

doc/src/sgml/ref/vacuum.sgml
src/backend/commands/vacuum.c
src/test/regress/expected/vacuum.out
src/test/regress/sql/vacuum.sql

index 442977a50d5a074b521c0c6bb3d7564e4fd404f7..a48f75ad7baf28a0cd39903c89ad713ae7ebd972 100644 (file)
@@ -235,22 +235,22 @@ VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ <replaceable class="paramet
       Perform index vacuum and index cleanup phases of <command>VACUUM</command>
       in parallel using <replaceable class="parameter">integer</replaceable>
       background workers (for the details of each vacuum phase, please
-      refer to <xref linkend="vacuum-phases"/>).  If the
-      <literal>PARALLEL</literal> option is omitted, then the number of workers
-      is determined based on the number of indexes that support parallel vacuum
-      operation on the relation, and is further limited by <xref
-      linkend="guc-max-parallel-workers-maintenance"/>.
-      An index can participate in parallel vacuum if and only if the size
-      of the index is more than <xref linkend="guc-min-parallel-index-scan-size"/>.
-      Please note that it is not guaranteed that the number of parallel workers
-      specified in <replaceable class="parameter">integer</replaceable> will
-      be used during execution.  It is possible for a vacuum to run with fewer
-      workers than specified, or even with no workers at all.  Only one worker
-      can be used per index.  So parallel workers are launched only when there
-      are at least <literal>2</literal> indexes in the table.  Workers for
-      vacuum are launched before the start of each phase and exit at the end of
-      the phase.  These behaviors might change in a future release.  This
-      option can't be used with the <literal>FULL</literal> option.
+      refer to <xref linkend="vacuum-phases"/>).  In plain <command>VACUUM</command>
+      (without <literal>FULL</literal>), if the <literal>PARALLEL</literal> option
+      is omitted, then the number of workers is determined based on the number of
+      indexes on the relation that support parallel vacuum operation and is further
+      limited by <xref linkend="guc-max-parallel-workers-maintenance"/>.  An index
+      can participate in parallel vacuum if and only if the size of the index is
+      more than <xref linkend="guc-min-parallel-index-scan-size"/>.  Please note
+      that it is not guaranteed that the number of parallel workers specified in
+      <replaceable class="parameter">integer</replaceable> will be used during
+      execution.  It is possible for a vacuum to run with fewer workers than
+      specified, or even with no workers at all.  Only one worker can be used per
+      index.  So parallel workers are launched only when there are at least
+      <literal>2</literal> indexes in the table.  Workers for vacuum are launched
+      before the start of each phase and exit at the end of the phase.  These
+      behaviors might change in a future release.  This option can't be used with
+      the <literal>FULL</literal> option.
      </para>
     </listitem>
    </varlistentry>
index 495ac23a26bd43db911132d20c9ffbd2c91fa803..5a110edb072ca2df40e866c0ce8e2ac9ec5801bf 100644 (file)
@@ -104,7 +104,6 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel)
    bool        freeze = false;
    bool        full = false;
    bool        disable_page_skipping = false;
-   bool        parallel_option = false;
    ListCell   *lc;
 
    /* Set default value */
@@ -145,7 +144,6 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel)
            params.truncate = get_vacopt_ternary_value(opt);
        else if (strcmp(opt->defname, "parallel") == 0)
        {
-           parallel_option = true;
            if (opt->arg == NULL)
            {
                ereport(ERROR,
@@ -199,10 +197,10 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel)
           !(params.options & (VACOPT_FULL | VACOPT_FREEZE)));
    Assert(!(params.options & VACOPT_SKIPTOAST));
 
-   if ((params.options & VACOPT_FULL) && parallel_option)
+   if ((params.options & VACOPT_FULL) && params.nworkers > 0)
        ereport(ERROR,
                (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-                errmsg("cannot specify both FULL and PARALLEL options")));
+                errmsg("VACUUM FULL cannot be performed in parallel")));
 
    /*
     * Make sure VACOPT_ANALYZE is specified if any column lists are present.
index 0cfe28e63f6ec8cf4a4d1ef4ffb55b2497b55ac1..736c2f60d20f0486048f48ee3a8b0b48337922cb 100644 (file)
@@ -115,15 +115,17 @@ LINE 1: VACUUM (PARALLEL -1) pvactst;
                 ^
 VACUUM (PARALLEL 2, INDEX_CLEANUP FALSE) pvactst;
 VACUUM (PARALLEL 2, FULL TRUE) pvactst; -- error, cannot use both PARALLEL and FULL
-ERROR:  cannot specify both FULL and PARALLEL options
+ERROR:  VACUUM FULL cannot be performed in parallel
 VACUUM (PARALLEL) pvactst; -- error, cannot use PARALLEL option without parallel degree
 ERROR:  parallel option requires a value between 0 and 1024
 LINE 1: VACUUM (PARALLEL) pvactst;
                 ^
+-- Test different combinations of parallel and full options for temporary tables
 CREATE TEMPORARY TABLE tmp (a int PRIMARY KEY);
 CREATE INDEX tmp_idx1 ON tmp (a);
-VACUUM (PARALLEL 1) tmp; -- disables parallel vacuum option
+VACUUM (PARALLEL 1, FULL FALSE) tmp; -- parallel vacuum disabled for temp tables
 WARNING:  disabling parallel option of vacuum on "tmp" --- cannot vacuum temporary tables in parallel
+VACUUM (PARALLEL 0, FULL TRUE) tmp; -- can specify parallel disabled (even though that's implied by FULL)
 RESET min_parallel_index_scan_size;
 DROP TABLE pvactst;
 -- INDEX_CLEANUP option
index cf741f7b114bb8fb74a488cf9d018834e29b005f..84dee8c8169e164e00916906052d223390922b36 100644 (file)
@@ -100,9 +100,12 @@ VACUUM (PARALLEL -1) pvactst; -- error
 VACUUM (PARALLEL 2, INDEX_CLEANUP FALSE) pvactst;
 VACUUM (PARALLEL 2, FULL TRUE) pvactst; -- error, cannot use both PARALLEL and FULL
 VACUUM (PARALLEL) pvactst; -- error, cannot use PARALLEL option without parallel degree
+
+-- Test different combinations of parallel and full options for temporary tables
 CREATE TEMPORARY TABLE tmp (a int PRIMARY KEY);
 CREATE INDEX tmp_idx1 ON tmp (a);
-VACUUM (PARALLEL 1) tmp; -- disables parallel vacuum option
+VACUUM (PARALLEL 1, FULL FALSE) tmp; -- parallel vacuum disabled for temp tables
+VACUUM (PARALLEL 0, FULL TRUE) tmp; -- can specify parallel disabled (even though that's implied by FULL)
 RESET min_parallel_index_scan_size;
 DROP TABLE pvactst;