• Andres Freund's avatar
    Fix possibility of self-deadlock in ResolveRecoveryConflictWithBufferPin(). · 9ab3b2bd
    Andres Freund authored
    The tests added in 9f8a050f68d failed nearly reliably on FreeBSD in CI, and
    occasionally on the buildfarm. That turns out to be caused not by a bug in the
    test, but by a longstanding bug in recovery conflict handling.
    
    The standby timeout handler, used by ResolveRecoveryConflictWithBufferPin(),
    executed SendRecoveryConflictWithBufferPin() inside a signal handler. A bad
    idea, because the deadlock timeout handler (or a spurious latch set) could
    have interrupted ProcWaitForSignal(). If unlucky that could cause a
    self-deadlock on ProcArrayLock, if the deadlock check is in
    SendRecoveryConflictWithBufferPin()->CancelDBBackends().
    
    To fix, set a flag in StandbyTimeoutHandler(), and check the flag in
    ResolveRecoveryConflictWithBufferPin().
    
    Subsequently the recovery conflict tests will be backpatched.
    
    Discussion: https://postgr.es/m/20220413002626.udl7lll7f3o7nre7@alap3.anarazel.de
    Backpatch: 10-
    9ab3b2bd
standby.c 45.5 KB