• Thomas Munro's avatar
    Enable parallel query with SERIALIZABLE isolation. · bb16aba5
    Thomas Munro authored
    Previously, the SERIALIZABLE isolation level prevented parallel query
    from being used.  Allow the two features to be used together by
    sharing the leader's SERIALIZABLEXACT with parallel workers.
    
    An extra per-SERIALIZABLEXACT LWLock is introduced to make it safe to
    share, and new logic is introduced to coordinate the early release
    of the SERIALIZABLEXACT required for the SXACT_FLAG_RO_SAFE
    optimization, as follows:
    
    The first backend to observe the SXACT_FLAG_RO_SAFE flag (set by
    some other transaction) will 'partially release' the SERIALIZABLEXACT,
    meaning that the conflicts and locks it holds are released, but the
    SERIALIZABLEXACT itself will remain active because other backends
    might still have a pointer to it.
    
    Whenever any backend notices the SXACT_FLAG_RO_SAFE flag, it clears
    its own MySerializableXact variable and frees local resources so that
    it can skip SSI checks for the rest of the transaction.  In the
    special case of the leader process, it transfers the SERIALIZABLEXACT
    to a new variable SavedSerializableXact, so that it can be completely
    released at the end of the transaction after all workers have exited.
    
    Remove the serializable_okay flag added to CreateParallelContext() by
    commit 9da0cc35, because it's now redundant.
    
    Author: Thomas Munro
    Reviewed-by: Haribabu Kommi, Robert Haas, Masahiko Sawada, Kevin Grittner
    Discussion: https://postgr.es/m/CAEepm=0gXGYhtrVDWOTHS8SQQy_=S9xo+8oCxGLWZAOoeJ=yzQ@mail.gmail.com
    bb16aba5
predicate_internals.h 17.4 KB