loolwsd/DocumentBroker.cpp | 27 ++++++++++++++++++++++++++- loolwsd/DocumentBroker.hpp | 2 ++ 2 files changed, 28 insertions(+), 1 deletion(-)
New commits: commit 4f4472ffa6e11bf8b77c8e64198c5e159dbd9daa Author: Ashod Nakashian <ashod.nakash...@collabora.co.uk> Date: Sat Oct 15 17:07:40 2016 -0400 loolwsd: shutdown client sockets and cleanup when kit dies Change-Id: I4d59553d744a8075d4d873ff520d9f3e417521b3 Reviewed-on: https://gerrit.libreoffice.org/29947 Reviewed-by: Ashod Nakashian <ashnak...@gmail.com> Tested-by: Ashod Nakashian <ashnak...@gmail.com> diff --git a/loolwsd/DocumentBroker.cpp b/loolwsd/DocumentBroker.cpp index 0d36497..dceb1c5 100644 --- a/loolwsd/DocumentBroker.cpp +++ b/loolwsd/DocumentBroker.cpp @@ -53,6 +53,16 @@ void ChildProcess::socketProcessor() }, []() { }, [this]() { return TerminationFlag || this->_stop; }); + + Log::debug() << "Child [" << getPid() << "] WS terminated. Notifying DocBroker." << Log::end; + + + // Notify the broker that we're done. + auto docBroker = _docBroker.lock(); + if (docBroker) + { + docBroker->childSocketTerminated(); + } } namespace @@ -286,7 +296,7 @@ bool DocumentBroker::autoSave(const bool force, const size_t waitTimeoutMs) { std::unique_lock<std::mutex> lock(_mutex); if (_sessions.empty() || _storage == nullptr || !_isLoaded || - (!_isModified && !force)) + !_childProcess->isAlive() || (!_isModified && !force)) { // Nothing to do. Log::trace("Nothing to autosave [" + _docKey + "]."); @@ -824,4 +834,19 @@ const std::chrono::duration<double> DocumentBroker::getStorageLoadDuration() con return std::chrono::duration<double>::zero(); } +void DocumentBroker::childSocketTerminated() +{ + if (!_childProcess->isAlive()) + { + Log::error("Child for doc [" + _docKey + "] terminated prematurely."); + } + + // We could restore the kit if this was unexpected. + // For now, close the connections to cleanup. + for (auto& pair : _sessions) + { + pair.second->shutdown(Poco::Net::WebSocket::WS_ENDPOINT_GOING_AWAY); + } +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/loolwsd/DocumentBroker.hpp b/loolwsd/DocumentBroker.hpp index d5e8b42..7972903 100644 --- a/loolwsd/DocumentBroker.hpp +++ b/loolwsd/DocumentBroker.hpp @@ -266,6 +266,8 @@ public: /// Currently, only makes sense in case storage is WOPI const std::chrono::duration<double> getStorageLoadDuration() const; + void childSocketTerminated(); + private: /// Sends the .uno:Save command to LoKit. _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits