]> granicus.if.org Git - postgresql/commitdiff
Aggressively freeze tables when CLUSTER or VACUUM FULL rewrites them.
authorRobert Haas <rhaas@postgresql.org>
Thu, 2 Jan 2014 20:09:21 +0000 (15:09 -0500)
committerRobert Haas <rhaas@postgresql.org>
Thu, 2 Jan 2014 20:15:51 +0000 (15:15 -0500)
We haven't wanted to do this in the past on the grounds that in rare
cases the original xmin value will be needed for forensic purposes, but
commit 37484ad2aacef5ec794f4dd3d5cf814475180a78 removes that objection,
so now we can.

Per extensive discussion, among many people, on pgsql-hackers.

doc/src/sgml/ref/vacuum.sgml
src/backend/access/heap/rewriteheap.c
src/backend/commands/cluster.c
src/backend/commands/vacuum.c
src/include/commands/cluster.h

index eb71581dfd2ca59b00192f5bd444a01216ca3710..1e984734d93a769dc7772f775aedd6f4edb68dfa 100644 (file)
@@ -102,7 +102,9 @@ VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] ANALYZE [ <replaceable class="PARAMETER">
       Specifying <literal>FREEZE</literal> is equivalent to performing
       <command>VACUUM</command> with the
       <xref linkend="guc-vacuum-freeze-min-age"> parameter
-      set to zero.
+      set to zero.  Aggressive freezing is always performed when the
+      table is rewritten, so this option is redundant when <literal>FULL</>
+      is specified.
      </para>
     </listitem>
    </varlistentry>
index deec77ddff270d5f23c533f27ebe38b52f13573a..634754cd7b0ac52318b479a13b2144136c7a65f4 100644 (file)
@@ -345,7 +345,7 @@ rewrite_heap_tuple(RewriteState state,
 
        /*
         * While we have our hands on the tuple, we may as well freeze any
-        * very-old xmin or xmax, so that future VACUUM effort can be saved.
+        * eligible xmin or xmax, so that future VACUUM effort can be saved.
         */
        heap_freeze_tuple(new_tuple->t_data, state->rs_freeze_xid,
                                          state->rs_cutoff_multi);
index 0b8ac8c8d8e1f7bacde29df0404a195021cddf51..9f412786f0326c7337e4234500f8d1cf6e143f9c 100644 (file)
@@ -64,12 +64,10 @@ typedef struct
 } RelToCluster;
 
 
-static void rebuild_relation(Relation OldHeap, Oid indexOid,
-                                int freeze_min_age, int freeze_table_age, bool verbose);
+static void rebuild_relation(Relation OldHeap, Oid indexOid, bool verbose);
 static void copy_heap_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex,
-                          int freeze_min_age, int freeze_table_age, bool verbose,
-                          bool *pSwapToastByContent, TransactionId *pFreezeXid,
-                          MultiXactId *pCutoffMulti);
+                          bool verbose, bool *pSwapToastByContent,
+                          TransactionId *pFreezeXid, MultiXactId *pCutoffMulti);
 static List *get_tables_to_cluster(MemoryContext cluster_context);
 static void reform_and_rewrite_tuple(HeapTuple tuple,
                                                 TupleDesc oldTupDesc, TupleDesc newTupDesc,
@@ -176,11 +174,8 @@ cluster(ClusterStmt *stmt, bool isTopLevel)
                /* close relation, keep lock till commit */
                heap_close(rel, NoLock);
 
-               /*
-                * Do the job.  We use a -1 freeze_min_age to avoid having CLUSTER
-                * freeze tuples earlier than a plain VACUUM would.
-                */
-               cluster_rel(tableOid, indexOid, false, stmt->verbose, -1, -1);
+               /* Do the job. */
+               cluster_rel(tableOid, indexOid, false, stmt->verbose);
        }
        else
        {
@@ -229,9 +224,8 @@ cluster(ClusterStmt *stmt, bool isTopLevel)
                        StartTransactionCommand();
                        /* functions in indexes may want a snapshot set */
                        PushActiveSnapshot(GetTransactionSnapshot());
-                       /* Do the job.  As above, use a -1 freeze_min_age. */
-                       cluster_rel(rvtc->tableOid, rvtc->indexOid, true, stmt->verbose,
-                                               -1, -1);
+                       /* Do the job. */
+                       cluster_rel(rvtc->tableOid, rvtc->indexOid, true, stmt->verbose);
                        PopActiveSnapshot();
                        CommitTransactionCommand();
                }
@@ -262,8 +256,7 @@ cluster(ClusterStmt *stmt, bool isTopLevel)
  * and error messages should refer to the operation as VACUUM not CLUSTER.
  */
 void
-cluster_rel(Oid tableOid, Oid indexOid, bool recheck, bool verbose,
-                       int freeze_min_age, int freeze_table_age)
+cluster_rel(Oid tableOid, Oid indexOid, bool recheck, bool verbose)
 {
        Relation        OldHeap;
 
@@ -407,8 +400,7 @@ cluster_rel(Oid tableOid, Oid indexOid, bool recheck, bool verbose,
        TransferPredicateLocksToHeapRelation(OldHeap);
 
        /* rebuild_relation does all the dirty work */
-       rebuild_relation(OldHeap, indexOid, freeze_min_age, freeze_table_age,
-                                        verbose);
+       rebuild_relation(OldHeap, indexOid, verbose);
 
        /* NB: rebuild_relation does heap_close() on OldHeap */
 }
@@ -561,8 +553,7 @@ mark_index_clustered(Relation rel, Oid indexOid, bool is_internal)
  * NB: this routine closes OldHeap at the right time; caller should not.
  */
 static void
-rebuild_relation(Relation OldHeap, Oid indexOid,
-                                int freeze_min_age, int freeze_table_age, bool verbose)
+rebuild_relation(Relation OldHeap, Oid indexOid, bool verbose)
 {
        Oid                     tableOid = RelationGetRelid(OldHeap);
        Oid                     tableSpace = OldHeap->rd_rel->reltablespace;
@@ -587,8 +578,7 @@ rebuild_relation(Relation OldHeap, Oid indexOid,
                                                           AccessExclusiveLock);
 
        /* Copy the heap data into the new table in the desired order */
-       copy_heap_data(OIDNewHeap, tableOid, indexOid,
-                                  freeze_min_age, freeze_table_age, verbose,
+       copy_heap_data(OIDNewHeap, tableOid, indexOid, verbose,
                                   &swap_toast_by_content, &frozenXid, &cutoffMulti);
 
        /*
@@ -743,8 +733,7 @@ make_new_heap(Oid OIDOldHeap, Oid NewTableSpace, bool forcetemp,
  * *pCutoffMulti receives the MultiXactId used as a cutoff point.
  */
 static void
-copy_heap_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex,
-                          int freeze_min_age, int freeze_table_age, bool verbose,
+copy_heap_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex, bool verbose,
                           bool *pSwapToastByContent, TransactionId *pFreezeXid,
                           MultiXactId *pCutoffMulti)
 {
@@ -857,10 +846,11 @@ copy_heap_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex,
                *pSwapToastByContent = false;
 
        /*
-        * compute xids used to freeze and weed out dead tuples.
+        * Compute xids used to freeze and weed out dead tuples and multixacts.
+        * Since we're going to rewrite the whole table anyway, there's no reason
+        * not to be aggressive about this.
         */
-       vacuum_set_xid_limits(freeze_min_age, freeze_table_age,
-                                                 OldHeap->rd_rel->relisshared,
+       vacuum_set_xid_limits(0, 0, OldHeap->rd_rel->relisshared,
                                                  &OldestXmin, &FreezeXid, NULL, &MultiXactCutoff,
                                                  NULL);
 
index 11990609a3033ee41c6374006b995b6885726a4b..ba0e841eb995318b0a27d97ad82672a301a7af9e 100644 (file)
@@ -1149,8 +1149,7 @@ vacuum_rel(Oid relid, VacuumStmt *vacstmt, bool do_toast, bool for_wraparound)
 
                /* VACUUM FULL is now a variant of CLUSTER; see cluster.c */
                cluster_rel(relid, InvalidOid, false,
-                                       (vacstmt->options & VACOPT_VERBOSE) != 0,
-                                       vacstmt->freeze_min_age, vacstmt->freeze_table_age);
+                                       (vacstmt->options & VACOPT_VERBOSE) != 0);
        }
        else
                lazy_vacuum_rel(onerel, vacstmt, vac_strategy);
index a88731832ecf1d04bb9722625ff7ad059ea0e9a2..5dfa9981f449fafc39849d399b37e4b4c9452664 100644 (file)
@@ -20,7 +20,7 @@
 
 extern void cluster(ClusterStmt *stmt, bool isTopLevel);
 extern void cluster_rel(Oid tableOid, Oid indexOid, bool recheck,
-                       bool verbose, int freeze_min_age, int freeze_table_age);
+                       bool verbose);
 extern void check_index_is_clusterable(Relation OldHeap, Oid indexOid,
                                                   bool recheck, LOCKMODE lockmode);
 extern void mark_index_clustered(Relation rel, Oid indexOid, bool is_internal);