]> granicus.if.org Git - postgresql/commitdiff
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 */