Fix background workers not restarting with restart_after_crash = on
Andrey Rudometov <unlimitedhikari@gmail.com>
From: Andrey Rudometov <unlimitedhikari@gmail.com>
To: pgsql-hackers@postgresql.org
Date: 2025-06-11T08:26:01Z
Lists: pgsql-hackers
Attachments
- v1-0001-Reproduce-bgw-not-starting-after-restart_after_cr.patch (text/x-patch)
- v1-0002-Fix-bgw-not-starting-after-restart_after_crash.patch (text/x-patch)
Good day, hackers. Reading through changes committed in master, I noticed that after CleanupBackend/CleanupBackroundworker refactor background workers will fail to start again after postgres' restart with restart_after_crash = on. The reason is CleanupBackend and HandleChildCrash not setting background worker's rw_pid to zero anymore, if backend, well, crashed and failed to call shmem_exit and mark PMChild slot as inactive via MarkPostmasterChildInactive. Suggested solution is to finish CleanupBackend's background worker related logic even after treating the child process as crashed. In earlier versions zeroing of pids happen in HandleChildCrash anyway, so there should be no harm in doing the same actions here. For fast reproduction I used pg_prewarm extension, as it creates observable bgworker and is present in postgres tree, so tap test is easy to run. -- best regards, Andrey Rudometov