Skip to content

Commit 75f633f

Browse files
committed
Fix background worker not restarting after crash-and-restart cycle.
Previously, if a background worker crashed (e.g., due to a SIGKILL) and the server restarted due to restart_after_crash being enabled, the worker was not restarted as expected. Background workers without the never-restart flag should automatically restart in this case. This issue was introduced in commit 28a520c, which failed to reset the rw_pid field in the RegisteredBgWorker struct for the crashed worker. This commit fixes the problem by resetting rw_pid for all eligible background workers during the crash-and-restart cycle. Back-patched to v18, where the bug was introduced. Bug fix patches were proposed by Andrey Rudometov and ChangAo Chen, but this commit uses a different approach. Reported-by: Andrey Rudometov <unlimitedhikari@gmail.com> Reported-by: ChangAo Chen <cca5507@qq.com> Author: Andrey Rudometov <unlimitedhikari@gmail.com> Author: ChangAo Chen <cca5507@qq.com> Co-authored-by: Fujii Masao <masao.fujii@gmail.com> Reviewed-by: ChangAo Chen <cca5507@qq.com> Reviewed-by: Shveta Malik <shveta.malik@gmail.com> Discussion: https://postgr.es/m/CAF6JsWiO=i24qYitWe6ns1sXqcL86rYxdyU+pNYk-WueKPSySg@mail.gmail.com Discussion: https://postgr.es/m/tencent_E00A056B3953EE6440F0F40F80EC30427D09@qq.com Backpatch-through: 18
1 parent f7dfccf commit 75f633f

File tree

2 files changed

+8
-0
lines changed

2 files changed

+8
-0
lines changed

src/backend/postmaster/bgworker.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -613,6 +613,7 @@ ResetBackgroundWorkerCrashTimes(void)
613613
* resetting.
614614
*/
615615
rw->rw_crashed_at = 0;
616+
rw->rw_pid = 0;
616617

617618
/*
618619
* If there was anyone waiting for it, they're history.

src/backend/postmaster/postmaster.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2630,6 +2630,13 @@ CleanupBackend(PMChild *bp,
26302630
}
26312631
bp = NULL;
26322632

2633+
/*
2634+
* In a crash case, exit immediately without resetting background worker
2635+
* state. However, if restart_after_crash is enabled, the background
2636+
* worker state (e.g., rw_pid) still needs be reset so the worker can
2637+
* restart after crash recovery. This reset is handled in
2638+
* ResetBackgroundWorkerCrashTimes(), not here.
2639+
*/
26332640
if (crashed)
26342641
{
26352642
HandleChildCrash(bp_pid, exitstatus, procname);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy