• Tom Lane's avatar
    Fix issues with checks for unsupported transaction states in Hot Standby. · 7abaa6b9
    Tom Lane authored
    The GUC check hooks for transaction_read_only and transaction_isolation
    tried to check RecoveryInProgress(), so as to disallow setting read/write
    mode or serializable isolation level (respectively) in hot standby
    sessions.  However, GUC check hooks can be called in many situations where
    we're not connected to shared memory at all, resulting in a crash in
    RecoveryInProgress().  Among other cases, this results in EXEC_BACKEND
    builds crashing during child process start if default_transaction_isolation
    is serializable, as reported by Heikki Linnakangas.  Protect those calls
    by silently allowing any setting when not inside a transaction; which is
    okay anyway since these GUCs are always reset at start of transaction.
    
    Also, add a check to GetSerializableTransactionSnapshot() to complain
    if we are in hot standby.  We need that check despite the one in
    check_XactIsoLevel() because default_transaction_isolation could be
    serializable.  We don't want to complain any sooner than this in such
    cases, since that would prevent running transactions at all in such a
    state; but a transaction can be run, if SET TRANSACTION ISOLATION is done
    before setting a snapshot.  Per report some months ago from Robert Haas.
    
    Back-patch to 9.1, since these problems were introduced by the SSI patch.
    
    Kevin Grittner and Tom Lane, with ideas from Heikki Linnakangas
    7abaa6b9
variable.c 23.3 KB