mirror of
https://github.com/postgres/postgres.git
synced 2025-05-01 01:04:50 +03:00
Fix some more bugs in signal handlers and process shutdown logic.
WalSndKill was doing things exactly backwards: it should first clear MyWalSnd (to stop signal handlers from touching MyWalSnd->latch), then disown the latch, and only then mark the WalSnd struct unused by clearing its pid field. Also, WalRcvSigUsr1Handler and worker_spi_sighup failed to preserve errno, which is surely a requirement for any signal handler. Per discussion of recent buildfarm failures. Back-patch as far as the relevant code exists.
This commit is contained in:
parent
fad443753e
commit
81b116d987
@ -950,17 +950,23 @@ InitWalSnd(void)
|
||||
static void
|
||||
WalSndKill(int code, Datum arg)
|
||||
{
|
||||
Assert(MyWalSnd != NULL);
|
||||
WalSnd *walsnd = MyWalSnd;
|
||||
|
||||
Assert(walsnd != NULL);
|
||||
|
||||
/*
|
||||
* Clear MyWalSnd first; then disown the latch. This is so that signal
|
||||
* handlers won't try to touch the latch after it's no longer ours.
|
||||
*/
|
||||
MyWalSnd = NULL;
|
||||
|
||||
DisownLatch(&walsnd->latch);
|
||||
|
||||
/*
|
||||
* Mark WalSnd struct no longer in use. Assume that no lock is required
|
||||
* for this.
|
||||
*/
|
||||
MyWalSnd->pid = 0;
|
||||
DisownLatch(&MyWalSnd->latch);
|
||||
|
||||
/* WalSnd struct isn't mine anymore */
|
||||
MyWalSnd = NULL;
|
||||
walsnd->pid = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
x
Reference in New Issue
Block a user