Skip to content

Commit e2ce9aa

Browse files
committed
Never crash-and-restart for bgworkers without shared memory access.
The motivation for a crash and restart cycle when a backend dies is that it might have corrupted shared memory on the way down; and we can't recover reliably except by reinitializing everything. But that doesn't apply to processes that don't touch shared memory. Currently, there's nothing to prevent a background worker that doesn't request shared memory access from touching shared memory anyway, but that's a separate bug. Previous to this commit, the coding in postmaster.c was inconsistent: an exit status other than 0 or 1 didn't provoke a crash-and-restart, but failure to release the postmaster child slot did. This change makes those cases consistent.
1 parent 1891b41 commit e2ce9aa

File tree

1 file changed

+10
-10
lines changed

1 file changed

+10
-10
lines changed

src/backend/postmaster/postmaster.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2864,17 +2864,17 @@ CleanupBackgroundWorker(int pid,
28642864
HandleChildCrash(pid, exitstatus, namebuf);
28652865
return true;
28662866
}
2867-
}
28682867

2869-
if (!ReleasePostmasterChildSlot(rw->rw_child_slot))
2870-
{
2871-
/*
2872-
* Uh-oh, the child failed to clean itself up. Treat as a crash
2873-
* after all.
2874-
*/
2875-
rw->rw_crashed_at = GetCurrentTimestamp();
2876-
HandleChildCrash(pid, exitstatus, namebuf);
2877-
return true;
2868+
if (!ReleasePostmasterChildSlot(rw->rw_child_slot))
2869+
{
2870+
/*
2871+
* Uh-oh, the child failed to clean itself up. Treat as a
2872+
* crash after all.
2873+
*/
2874+
rw->rw_crashed_at = GetCurrentTimestamp();
2875+
HandleChildCrash(pid, exitstatus, namebuf);
2876+
return true;
2877+
}
28782878
}
28792879

28802880
/* Get it out of the BackendList and clear out remaining data */

0 commit comments

Comments
 (0)