From 7be47c56af3d3013955c91c2877c08f2a0e3e6a2 Mon Sep 17 00:00:00 2001
From: Robert Haas <rhaas@postgresql.org>
Date: Thu, 7 May 2015 11:00:47 -0400
Subject: [PATCH] Fix incorrect math in DetermineSafeOldestOffset.

The old formula didn't have enough parentheses, so it would do the wrong
thing, and it used / rather than % to find a remainder.  The effect of
these oversights is that the stop point chosen by the logic introduced in
commit b69bf30b9bfacafc733a9ba77c9587cf54d06c0c might be rather
meaningless.

Thomas Munro, reviewed by Kevin Grittner, with a whitespace tweak by me.
---
 src/backend/access/transam/multixact.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/backend/access/transam/multixact.c b/src/backend/access/transam/multixact.c
index 928f9fe5d6c..cbb69f5e10c 100644
--- a/src/backend/access/transam/multixact.c
+++ b/src/backend/access/transam/multixact.c
@@ -2495,7 +2495,8 @@ DetermineSafeOldestOffset(MultiXactId oldestMXact)
 	 */
 	oldestOffset = find_multixact_start(oldestMXact);
 	/* move back to start of the corresponding segment */
-	oldestOffset -= oldestOffset / MULTIXACT_MEMBERS_PER_PAGE * SLRU_PAGES_PER_SEGMENT;
+	oldestOffset -= oldestOffset %
+		(MULTIXACT_MEMBERS_PER_PAGE * SLRU_PAGES_PER_SEGMENT);
 
 	LWLockAcquire(MultiXactGenLock, LW_EXCLUSIVE);
 	/* always leave one segment before the wraparound point */
-- 
GitLab