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

Reply via email to