• Robert Haas's avatar
    Advance the stop point for multixact offset creation only at checkpoint. · f6a6c46d
    Robert Haas authored
    Commit b69bf30b advanced the stop point
    at vacuum time, but this has subsequently been shown to be unsafe as a
    result of analysis by myself and Thomas Munro and testing by Thomas
    Munro.  The crux of the problem is that the SLRU deletion logic may
    get confused about what to remove if, at exactly the right time during
    the checkpoint process, the head of the SLRU crosses what used to be
    the tail.
    
    This patch, by me, fixes the problem by advancing the stop point only
    following a checkpoint.  This has the additional advantage of making
    the removal logic work during recovery more like the way it works during
    normal running, which is probably good.
    
    At least one of the calls to DetermineSafeOldestOffset which this patch
    removes was already dead, because MultiXactAdvanceOldest is called only
    during recovery and DetermineSafeOldestOffset was set up to do nothing
    during recovery.  That, however, is inconsistent with the principle that
    recovery and normal running should work similarly, and was confusing to
    boot.
    
    Along the way, fix some comments that previous patches in this area
    neglected to update.  It's not clear to me whether there's any
    concrete basis for the decision to use only half of the multixact ID
    space, but it's neither necessary nor sufficient to prevent multixact
    member wraparound, so the comments should not say otherwise.
    f6a6c46d
multixact.c 99.3 KB