Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Fix incorrect math in DetermineSafeOldestOffset.
authorRobert Haas <rhaas@postgresql.org>
Thu, 7 May 2015 15:00:47 +0000 (11:00 -0400)
committerRobert Haas <rhaas@postgresql.org>
Thu, 7 May 2015 15:16:41 +0000 (11:16 -0400)
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

index 5532dc6fc82038c83171fce659e3d039135f69d4..424cceb1cf0513b40197159bd247d22de4223c5e 100644 (file)
@@ -2514,7 +2514,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 */