• Robert Haas's avatar
    Fix broken snapshot handling in parallel workers. · 11c12398
    Robert Haas authored
    Pengchengliu reported an assertion failure in a parallel woker while
    performing a parallel scan using an overflowed snapshot. The proximate
    cause is that TransactionXmin was set to an incorrect value.  The
    underlying cause is incorrect snapshot handling in parallel.c.
    
    In particular, InitializeParallelDSM() was unconditionally calling
    GetTransactionSnapshot(), because I (rhaas) mistakenly thought that
    was always retrieving an existing snapshot whereas, at isolation
    levels less than REPEATABLE READ, it's actually taking a new one. So
    instead do this only at higher isolation levels where there actually
    is a single snapshot for the whole transaction.
    
    By itself, this is not a sufficient fix, because we still need to
    guarantee that TransactionXmin gets set properly in the workers. The
    easiest way to do that seems to be to install the leader's active
    snapshot as the transaction snapshot if the leader did not serialize a
    transaction snapshot. This doesn't affect the results of future
    GetTrasnactionSnapshot() calls since those have to take a new snapshot
    anyway; what we care about is the side effect of setting TransactionXmin.
    
    Report by Pengchengliu. Patch by Greg Nancarrow, except for some comment
    text which I supplied.
    
    Discussion: https://postgr.es/m/002f01d748ac$eaa781a0$bff684e0$@tju.edu.cn
    11c12398
parallel.c 49.9 KB