diff options
author | Andres Freund <andres@anarazel.de> | 2022-05-02 18:25:00 -0700 |
---|---|---|
committer | Andres Freund <andres@anarazel.de> | 2022-05-02 18:28:10 -0700 |
commit | 57c5ad168be1ce9a5e91adb4c576996921cd8627 (patch) | |
tree | b073616c253eaf447ff379e9493c42c84bea3a8b /src/tutorial/complex.c | |
parent | 90abe1e17f9d3f725cf92a3ef43593ec56eaf671 (diff) |
Fix possibility of self-deadlock in ResolveRecoveryConflictWithBufferPin().
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-
Diffstat (limited to 'src/tutorial/complex.c')
0 files changed, 0 insertions, 0 deletions