[Libreoffice-commits] online.git: net/Socket.cpp net/Socket.hpp wsd/DocumentBroker.cpp wsd/DocumentBroker.hpp
Michael Meeks (via logerrit)
logerrit at kemper.freedesktop.org
Thu Mar 26 11:03:25 UTC 2020
net/Socket.cpp | 5 +++++
net/Socket.hpp | 31 ++++++++++++++++++++++++++++++-
wsd/DocumentBroker.cpp | 16 ++++++++++++++--
wsd/DocumentBroker.hpp | 3 +++
4 files changed, 52 insertions(+), 3 deletions(-)
New commits:
commit a73590d81f4cf910568aa49f73e78abfb412eab7
Author: Michael Meeks <michael.meeks at collabora.com>
AuthorDate: Tue Mar 24 12:20:41 2020 +0000
Commit: Michael Meeks <michael.meeks at collabora.com>
CommitDate: Thu Mar 26 12:03:06 2020 +0100
wsd: minimize wait when DocBroker terminates
Add checking up the stack to detect when we have clean queues
and buffers so we can exit fast.
Change-Id: I82c3843f816bbe869094c21f070774e6d034ac65
Reviewed-on: https://gerrit.libreoffice.org/c/online/+/90358
Reviewed-by: Michael Meeks <michael.meeks at collabora.com>
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
diff --git a/net/Socket.cpp b/net/Socket.cpp
index 5bb1fa250..cb19c99cd 100644
--- a/net/Socket.cpp
+++ b/net/Socket.cpp
@@ -200,6 +200,11 @@ void SocketPoll::wakeupWorld()
wakeup(fd);
}
+bool ProtocolHandlerInterface::hasPendingWork() const
+{
+ return _msgHandler && _msgHandler->hasQueuedMessages();
+}
+
#if !MOBILEAPP
void SocketPoll::insertNewWebSocketSync(
diff --git a/net/Socket.hpp b/net/Socket.hpp
index a6395b9b4..d09c39334 100644
--- a/net/Socket.hpp
+++ b/net/Socket.hpp
@@ -162,6 +162,9 @@ public:
std::chrono::steady_clock::time_point now,
int events) = 0;
+ /// Is all data sent, so tha we can shutdown ?
+ virtual bool hasPendingWork() const { return false; }
+
/// manage latency issues around packet aggregation
void setNoDelay()
{
@@ -290,7 +293,7 @@ public:
}
/// Asserts in the debug builds, otherwise just logs.
- void assertCorrectThread()
+ void assertCorrectThread() const
{
if (InhibitThreadChecks)
return;
@@ -392,6 +395,9 @@ public:
_msgHandler = msgHandler;
}
+ /// Do we have something to send ?
+ virtual bool hasPendingWork() const;
+
/// Clear all external references
virtual void dispose() { _msgHandler.reset(); }
@@ -768,6 +774,21 @@ public:
return _pollSockets.size();
}
+ bool hasPendingWork() const
+ {
+ assertCorrectThread();
+
+ if (_newCallbacks.size() > 0 ||
+ _newSockets.size() > 0)
+ return true;
+
+ for (auto &i : _pollSockets)
+ if (i->hasPendingWork())
+ return true;
+
+ return false;
+ }
+
const std::string& name() const { return _name; }
/// Start the polling thread (if desired)
@@ -926,6 +947,14 @@ public:
return events;
}
+ bool hasPendingWork() const override
+ {
+ assertCorrectThread();
+ if (!_outBuffer.empty() || !_inBuffer.empty())
+ return true;
+ return _socketHandler && _socketHandler->hasPendingWork();
+ }
+
/// Send data to the socket peer.
void send(const char* data, const int len, const bool flush = true)
{
diff --git a/wsd/DocumentBroker.cpp b/wsd/DocumentBroker.cpp
index 8c229fd18..4aa52622e 100644
--- a/wsd/DocumentBroker.cpp
+++ b/wsd/DocumentBroker.cpp
@@ -448,14 +448,14 @@ void DocumentBroker::pollThread()
<< ", TerminationFlag: " << SigUtil::getTerminationFlag()
<< ". Terminating child with reason: [" << _closeReason << "].");
const auto flushStartTime = std::chrono::steady_clock::now();
- while (_poll->getSocketCount())
+ while (_poll->hasPendingWork() || hasDisconnectingSessions())
{
const auto now = std::chrono::steady_clock::now();
const int elapsedMs = std::chrono::duration_cast<std::chrono::milliseconds>(now - flushStartTime).count();
if (elapsedMs > flushTimeoutMs)
break;
- _poll->poll(std::min(flushTimeoutMs - elapsedMs, POLL_TIMEOUT_MS / 5));
+ _poll->poll(std::min(flushTimeoutMs - elapsedMs, POLL_TIMEOUT_MS / 10));
}
LOG_INF("Finished flushing socket for doc [" << _docKey << "]. stop: " << _stop << ", continuePolling: " <<
@@ -480,6 +480,18 @@ void DocumentBroker::pollThread()
LOG_INF("Finished docBroker polling thread for docKey [" << _docKey << "].");
}
+bool DocumentBroker::hasDisconnectingSessions() const
+{
+ for (const auto& pair : _sessions)
+ {
+ const std::shared_ptr<ClientSession> &session = pair.second;
+ // need to wait around to fetch clipboards from disconnecting sessions.
+ if (session->inWaitDisconnected())
+ return true;
+ }
+ return false;
+}
+
bool DocumentBroker::isAlive() const
{
if (!_stop || _poll->isAlive())
diff --git a/wsd/DocumentBroker.hpp b/wsd/DocumentBroker.hpp
index 68369d274..e304cd60c 100644
--- a/wsd/DocumentBroker.hpp
+++ b/wsd/DocumentBroker.hpp
@@ -442,6 +442,9 @@ private:
/// Starts the Kit <-> DocumentBroker shutdown handshake
void disconnectSessionInternal(const std::string& id);
+ /// Are any of our sessions still dis-connecting ?
+ bool hasDisconnectingSessions() const;
+
/// Forward a message from child session to its respective client session.
bool forwardToClient(const std::shared_ptr<Message>& payload);
More information about the Libreoffice-commits
mailing list