1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-05 07:21:24 +03:00

When a bgworker exits, always call ReleasePostmasterChildSlot.

Commit e2ce9aa27b was insufficiently
well thought out.  Repair.
This commit is contained in:
Robert Haas
2014-05-07 16:30:23 -04:00
parent 970d1f76d1
commit eee6cf1f33

View File

@ -2856,24 +2856,26 @@ CleanupBackgroundWorker(int pid,
* backend, any exit status other than 0 or 1 is considered a crash * backend, any exit status other than 0 or 1 is considered a crash
* and causes a system-wide restart. * and causes a system-wide restart.
*/ */
if (rw->rw_worker.bgw_flags & BGWORKER_SHMEM_ACCESS) if ((rw->rw_worker.bgw_flags & BGWORKER_SHMEM_ACCESS) != 0)
{ {
if (!EXIT_STATUS_0(exitstatus) && !EXIT_STATUS_1(exitstatus)) if (!EXIT_STATUS_0(exitstatus) && !EXIT_STATUS_1(exitstatus))
{ {
HandleChildCrash(pid, exitstatus, namebuf); HandleChildCrash(pid, exitstatus, namebuf);
return true; return true;
} }
}
if (!ReleasePostmasterChildSlot(rw->rw_child_slot))
{
/* /*
* Uh-oh, the child failed to clean itself up. Treat as a * We must release the postmaster child slot whether this worker
* crash after all. * is connected to shared memory or not, but we only treat it as
* a crash if it is in fact connected.
*/ */
if (!ReleasePostmasterChildSlot(rw->rw_child_slot) &&
(rw->rw_worker.bgw_flags & BGWORKER_SHMEM_ACCESS) != 0)
{
HandleChildCrash(pid, exitstatus, namebuf); HandleChildCrash(pid, exitstatus, namebuf);
return true; return true;
} }
}
/* Get it out of the BackendList and clear out remaining data */ /* Get it out of the BackendList and clear out remaining data */
if (rw->rw_backend) if (rw->rw_backend)