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
1 changed files with 12 additions and 10 deletions

View File

@ -2856,23 +2856,25 @@ CleanupBackgroundWorker(int pid,
* backend, any exit status other than 0 or 1 is considered a crash
* 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))
{
HandleChildCrash(pid, exitstatus, namebuf);
return true;
}
}
if (!ReleasePostmasterChildSlot(rw->rw_child_slot))
{
/*
* Uh-oh, the child failed to clean itself up. Treat as a
* crash after all.
*/
HandleChildCrash(pid, exitstatus, namebuf);
return true;
}
/*
* We must release the postmaster child slot whether this worker
* 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);
return true;
}
/* Get it out of the BackendList and clear out remaining data */