fix_multixact_limit.patch

application/octet-stream

Filename: fix_multixact_limit.patch
Type: application/octet-stream
Part: 0
Message: ERROR: multixact X from before cutoff Y found to be still running

Patch

Format: unified
File+
src/backend/commands/vacuum.c 4 2
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index e154507ecd..8ba42d79fa 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -893,6 +893,7 @@ vacuum_set_xid_limits(Relation rel,
 	int			effective_multixact_freeze_max_age;
 	TransactionId limit;
 	TransactionId safeLimit;
+	MultiXactId oldestMxact;
 	MultiXactId mxactLimit;
 	MultiXactId safeMxactLimit;
 
@@ -970,7 +971,8 @@ vacuum_set_xid_limits(Relation rel,
 	Assert(mxid_freezemin >= 0);
 
 	/* compute the cutoff multi, being careful to generate a valid value */
-	mxactLimit = GetOldestMultiXactId() - mxid_freezemin;
+	oldestMxact = GetOldestMultiXactId();
+	mxactLimit = oldestMxact - mxid_freezemin;
 	if (mxactLimit < FirstMultiXactId)
 		mxactLimit = FirstMultiXactId;
 
@@ -984,7 +986,7 @@ vacuum_set_xid_limits(Relation rel,
 		ereport(WARNING,
 				(errmsg("oldest multixact is far in the past"),
 				 errhint("Close open transactions with multixacts soon to avoid wraparound problems.")));
-		mxactLimit = safeMxactLimit;
+		mxactLimit = oldestMxact;
 	}
 
 	*multiXactCutoff = mxactLimit;