From: Alvaro Herrera Date: Fri, 27 Jun 2014 18:43:46 +0000 (-0400) Subject: Don't allow relminmxid to go backwards during VACUUM FULL X-Git-Tag: REL9_5_ALPHA1~1797 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b7e51d9c06e6a0da50abbbd0603ecb80f0b6f02b;p=postgresql Don't allow relminmxid to go backwards during VACUUM FULL 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 --- diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c index 54a2753182..b1c411a0b9 100644 --- a/src/backend/commands/cluster.c +++ b/src/backend/commands/cluster.c @@ -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;