[Libreoffice-commits] online.git: wsd/DocumentBroker.hpp wsd/LOOLWSD.cpp
Ashod Nakashian
ashod.nakashian at collabora.co.uk
Fri Feb 10 07:13:10 UTC 2017
wsd/DocumentBroker.hpp | 1 +
wsd/LOOLWSD.cpp | 8 +++++++-
2 files changed, 8 insertions(+), 1 deletion(-)
New commits:
commit 7f19d809b16d17f669f6e15b3bf52db1c764a975
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date: Fri Feb 10 01:43:32 2017 -0500
wsd: skip busy docBrokers when cleaning up
When cleaning up DocumentBrokers we hold
the global DocBrokersMutex. So we need
to keep this lock as short as possible
to serve new requests.
However when a given DocBroker is locked
and busy, or worse deadlocked, we'd end
up blocking any new client connection.
So here we skip busy DocBrokers while
cleaning up.
Change-Id: I188c9abc34fd90c4ba388894b47c1ab08d185129
Reviewed-on: https://gerrit.libreoffice.org/34119
Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
Tested-by: Ashod Nakashian <ashnakash at gmail.com>
diff --git a/wsd/DocumentBroker.hpp b/wsd/DocumentBroker.hpp
index a401b5a..2c0122d 100644
--- a/wsd/DocumentBroker.hpp
+++ b/wsd/DocumentBroker.hpp
@@ -312,6 +312,7 @@ public:
Poco::Process::PID getPid() const { return _childProcess->getPid(); }
std::unique_lock<std::mutex> getLock() { return std::unique_lock<std::mutex>(_mutex); }
+ std::unique_lock<std::mutex> getDeferredLock() { return std::unique_lock<std::mutex>(_mutex, std::defer_lock); }
void updateLastActivityTime();
diff --git a/wsd/LOOLWSD.cpp b/wsd/LOOLWSD.cpp
index 399a175..05cd665 100644
--- a/wsd/LOOLWSD.cpp
+++ b/wsd/LOOLWSD.cpp
@@ -281,7 +281,13 @@ bool cleanupDocBrokers()
for (auto it = DocBrokers.begin(); it != DocBrokers.end(); )
{
auto docBroker = it->second;
- auto lock = docBroker->getLock();
+ auto lock = docBroker->getDeferredLock();
+ if (!lock.try_lock())
+ {
+ // Document busy at the moment, cleanup later.
+ ++it;
+ continue;
+ }
// Remove idle documents after 1 hour.
const bool idle = (docBroker->getIdleTimeSecs() >= 3600);
More information about the Libreoffice-commits
mailing list