loolwsd/LOOLWSD.cpp | 48 ++++++++++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 18 deletions(-)
New commits: commit 8b5f112ebf56cc63ada0fe02c66d31dc10f7c439 Author: Ashod Nakashian <ashod.nakash...@collabora.co.uk> Date: Wed Nov 9 23:41:21 2016 -0500 loolwsd: recover when forkit dies Change-Id: Idc1e08fb496d3c68b22e1d8eab2da9a9064ef070 Reviewed-on: https://gerrit.libreoffice.org/30743 Reviewed-by: Ashod Nakashian <ashnak...@gmail.com> Tested-by: Ashod Nakashian <ashnak...@gmail.com> diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp index 4c9ed10..40876de 100644 --- a/loolwsd/LOOLWSD.cpp +++ b/loolwsd/LOOLWSD.cpp @@ -1834,7 +1834,15 @@ Process::PID LOOLWSD::createForKit() // The Pipe dtor closes the fd, so dup it. ForKitWritePipe = dup(inPipe.writeHandle()); - return child.id(); + const auto forkitPid = child.id(); + + // Init the Admin manager + Admin::instance().setForKitPid(forkitPid); + + // Spawn some children, if necessary. + preForkChildren(); + + return forkitPid; } int LOOLWSD::main(const std::vector<std::string>& /*args*/) @@ -1925,19 +1933,13 @@ int LOOLWSD::main(const std::vector<std::string>& /*args*/) srv2.start(); // Fire the ForKit process; we are ready to get child connections. - const Process::PID forKitPid = createForKit(); + Process::PID forKitPid = createForKit(); if (forKitPid < 0) { LOG_FTL("Failed to spawn loolforkit."); return Application::EXIT_SOFTWARE; } - // Init the Admin manager - Admin::instance().setForKitPid(forKitPid); - - // Spawn some children, if necessary. - preForkChildren(); - // Now we can serve clients; Start listening on the public port. std::unique_ptr<ServerSocket> psvs( UnitWSD::isUnitTesting() ? @@ -1967,17 +1969,27 @@ int LOOLWSD::main(const std::vector<std::string>& /*args*/) { if (forKitPid == pid) { - if (WIFEXITED(status) == true) + if (WIFEXITED(status) || WIFSIGNALED(status)) { - LOG_INF("Child process [" << pid << "] exited with code: " << WEXITSTATUS(status) << "."); - break; - } - else if (WIFSIGNALED(status) == true) - { - const auto fate = (WCOREDUMP(status) ? "core-dumped" : "died"); - LOG_ERR("Child process [" << pid << "] " << fate << - " with " << Util::signalName(WTERMSIG(status))); - break; + if (WIFEXITED(status)) + { + LOG_INF("Child process [" << pid << "] exited with code: " << + WEXITSTATUS(status) << "."); + } + else + { + LOG_ERR("Child process [" << pid << "] " << + (WCOREDUMP(status) ? "core-dumped" : "died") << + " with " << Util::signalName(WTERMSIG(status))); + } + + // Spawn a new forkit and try to dust it off and resume. + forKitPid = createForKit(); + if (forKitPid < 0) + { + LOG_FTL("Failed to spawn forkit instance. Shutting down."); + break; + } } else if (WIFSTOPPED(status) == true) { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits