diff options
author | Robert Haas <rhaas@postgresql.org> | 2014-05-07 13:19:02 -0400 |
---|---|---|
committer | Robert Haas <rhaas@postgresql.org> | 2014-05-07 13:19:02 -0400 |
commit | e2ce9aa27bf20eff2d991d0267a15ea5f7024cd7 (patch) | |
tree | 5eb08d708daf72b6f8cd3ceac8a069d7f255dced /src | |
parent | 1891b415f0cf45d56f29af423598f8518754d675 (diff) | |
download | postgresql-e2ce9aa27bf20eff2d991d0267a15ea5f7024cd7.tar.gz postgresql-e2ce9aa27bf20eff2d991d0267a15ea5f7024cd7.zip |
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/postmaster/postmaster.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 6d098874d9b..0c6a4271a60 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -2864,17 +2864,17 @@ CleanupBackgroundWorker(int pid, 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. - */ - rw->rw_crashed_at = GetCurrentTimestamp(); - 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. + */ + rw->rw_crashed_at = GetCurrentTimestamp(); + HandleChildCrash(pid, exitstatus, namebuf); + return true; + } } /* Get it out of the BackendList and clear out remaining data */ |