On 2015-12-10 08:55:54 -0500, Robert Haas wrote: > Maybe. But I think we could use a little more vigorous discussion of > that issue, since Andres doesn't seem to be very convinced by your > analysis, and I don't currently understand what you've fixed because I > can't, as mentioned several times, follow your patch stack.
The issue at hand is that the following block oldestOffsetKnown = find_multixact_start(oldestMultiXactId, &oldestOffset); ... else if (prevOldestOffsetKnown) { /* * If we failed to get the oldest offset this time, but we have a * value from a previous pass through this function, use the old value * rather than automatically forcing it. */ oldestOffset = prevOldestOffset; oldestOffsetKnown = true; } in SetOffsetVacuumLimit() fails to restore offsetStopLimit, which then is set in shared memory: /* Install the computed values */ LWLockAcquire(MultiXactGenLock, LW_EXCLUSIVE); MultiXactState->oldestOffset = oldestOffset; MultiXactState->oldestOffsetKnown = oldestOffsetKnown; MultiXactState->offsetStopLimit = offsetStopLimit; LWLockRelease(MultiXactGenLock); so, if find_multixact_start() failed - a "should never happen" occurance - we install a wrong stop limit. It does get 'repaired' upon the next suceeding find_multixact_start() in SetOffsetVacuumLimit() or a restart though. Adding a 'prevOffsetStopLimit' and using it seems like a ~5 line patch. -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers