]> granicus.if.org Git - postgresql/commitdiff
Don't allow relminmxid to go backwards during VACUUM FULL
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Fri, 27 Jun 2014 18:43:46 +0000 (14:43 -0400)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Fri, 27 Jun 2014 18:43:46 +0000 (14:43 -0400)
We were allowing a table's pg_class.relminmxid value to move backwards
when heaps were swapped by VACUUM FULL or CLUSTER.  There is a
similar protection against relfrozenxid going backwards, which we
neglected to clone when the multixact stuff was rejiggered by commit
0ac5ad5134f276.

Backpatch to 9.3, where relminmxid was introduced.

As reported by Heikki in
http://www.postgresql.org/message-id/52401AEA.9000608@vmware.com

src/backend/commands/cluster.c

index 54a275318253c43171f82181c7aa18d3d55a08a6..b1c411a0b9665366d00c208437cec5e629123f6c 100644 (file)
@@ -861,6 +861,12 @@ copy_heap_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex, bool verbose,
        if (TransactionIdPrecedes(FreezeXid, OldHeap->rd_rel->relfrozenxid))
                FreezeXid = OldHeap->rd_rel->relfrozenxid;
 
+       /*
+        * MultiXactCutoff, similarly, shouldn't go backwards either.
+        */
+       if (MultiXactIdPrecedes(MultiXactCutoff, OldHeap->rd_rel->relminmxid))
+               MultiXactCutoff = OldHeap->rd_rel->relminmxid;
+
        /* return selected values to caller */
        *pFreezeXid = FreezeXid;
        *pCutoffMulti = MultiXactCutoff;