postmaster-is-alive-bsd-workaround.patch
application/octet-stream
Filename: postmaster-is-alive-bsd-workaround.patch
Type: application/octet-stream
Part: 0
Message:
Re: bug in SignalSomeChildren
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: context
| File | + | − |
|---|---|---|
| src/backend/storage/ipc/pmsignal.c | 21 | 0 |
*** a/src/backend/storage/ipc/pmsignal.c
--- b/src/backend/storage/ipc/pmsignal.c
***************
*** 260,281 **** PostmasterIsAlive(bool amDirectChild)
#ifndef WIN32
if (amDirectChild)
{
/*
! * If the postmaster is alive, we'll still be its child. If it's
! * died, we'll be reassigned as a child of the init process.
! */
! return (getppid() == PostmasterPid);
! }
! else
! {
! /*
! * Use kill() to see if the postmaster is still alive. This can
! * sometimes give a false positive result, since the postmaster's PID
! * may get recycled, but it is good enough for existing uses by
! * indirect children.
*/
- return (kill(PostmasterPid, 0) == 0);
}
#else /* WIN32 */
return (WaitForSingleObject(PostmasterHandle, 0) == WAIT_TIMEOUT);
#endif /* WIN32 */
--- 260,289 ----
#ifndef WIN32
if (amDirectChild)
{
+ pid_t ppid = getppid();
+
+ /* If the postmaster is still our parent, it must be alive. */
+ if (ppid == PostmasterPid)
+ return true;
+
+ /* If the init process is our parent, postmaster must be dead. */
+ if (ppid == 1)
+ return false;
+
/*
! * If we get here, our parent process is neither the postmaster nor
! * init. This can occur on BSD and MacOS systems if a debugger has
! * been attached. We fall through to the less-reliable kill() method.
*/
}
+
+ /*
+ * Use kill() to see if the postmaster is still alive. This can
+ * sometimes give a false positive result, since the postmaster's PID
+ * may get recycled, but it is good enough for existing uses by
+ * indirect children and in debugging environments.
+ */
+ return (kill(PostmasterPid, 0) == 0);
#else /* WIN32 */
return (WaitForSingleObject(PostmasterHandle, 0) == WAIT_TIMEOUT);
#endif /* WIN32 */