When a bgworker exits, always call ReleasePostmasterChildSlot.
authorRobert Haas <rhaas@postgresql.org>
Wed, 7 May 2014 20:30:23 +0000 (16:30 -0400)
committerRobert Haas <rhaas@postgresql.org>
Wed, 7 May 2014 20:30:23 +0000 (16:30 -0400)
Commit e2ce9aa27bf20eff2d991d0267a15ea5f7024cd7 was insufficiently
well thought out.  Repair.

src/backend/postmaster/postmaster.c

index ec1a59d061a50ffb209bbd5cb8103697a7c00d88..79d1c506cc36eb20cd6b4f793db4c14b4dc92cb6 100644 (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 */