[Libreoffice-commits] online.git: wsd/ClientSession.cpp wsd/DocumentBroker.cpp wsd/DocumentBroker.hpp wsd/LOOLWSD.cpp
Ashod Nakashian
ashod.nakashian at collabora.co.uk
Mon Jan 15 14:03:39 UTC 2018
wsd/ClientSession.cpp | 2 +-
wsd/DocumentBroker.cpp | 30 ++++++++++++++++++------------
wsd/DocumentBroker.hpp | 2 +-
wsd/LOOLWSD.cpp | 4 ++--
4 files changed, 22 insertions(+), 16 deletions(-)
New commits:
commit b5baf3672fab052e5d7457fdb3a8c60c8fa70107
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date: Sun Jan 14 20:49:11 2018 -0500
wsd: stop DocBroker using only stop() member
Now always given a proper reason too.
Also, stop polling thread and cleanup when
failing to acquire/spawn a child process.
Change-Id: I7ddee01dd47b8ee72f2d9134c0f1b264634d8611
Reviewed-on: https://gerrit.libreoffice.org/47886
Reviewed-by: Michael Meeks <michael.meeks at collabora.com>
Tested-by: Michael Meeks <michael.meeks at collabora.com>
diff --git a/wsd/ClientSession.cpp b/wsd/ClientSession.cpp
index 061504c3..f644ae2c 100644
--- a/wsd/ClientSession.cpp
+++ b/wsd/ClientSession.cpp
@@ -716,7 +716,7 @@ bool ClientSession::handleKitToClientMessage(const char* buffer, const int lengt
docBroker->removeSession(getId());
// Now terminate.
- docBroker->stop();
+ docBroker->stop("Finished saveas handler.");
}
return true;
diff --git a/wsd/DocumentBroker.cpp b/wsd/DocumentBroker.cpp
index 44574aab..28a4920d 100644
--- a/wsd/DocumentBroker.cpp
+++ b/wsd/DocumentBroker.cpp
@@ -198,7 +198,7 @@ void DocumentBroker::pollThread()
_threadStart).count() > timeoutMs)
break;
- // Nominal time between retries, lest we busy-loop. getNewChild could also wait, so don't double that here.
+ // Nominal time between retries, lest we busy-loop. getNewChild could also wait, so don't double that here.
std::this_thread::sleep_for(std::chrono::milliseconds(CHILD_REBALANCE_INTERVAL_MS / 10));
}
while (!_stop && _poll->continuePolling() && !TerminationFlag && !ShutdownRequestFlag);
@@ -209,14 +209,21 @@ void DocumentBroker::pollThread()
LOG_ERR("Failed to get new child.");
// FIXME: need to notify all clients and shut this down ...
+ // FIXME: return something good down the websocket ...
#if 0
const std::string msg = SERVICE_UNAVAILABLE_INTERNAL_ERROR;
ws.sendMessage(msg);
// abnormal close frame handshake
ws.shutdown(WebSocketHandler::StatusCodes::ENDPOINT_GOING_AWAY);
#endif
- // FIXME: return something good down the websocket ...
- _stop = true;
+ stop("Failed to get new child.");
+
+ // Stop to mark it done and cleanup.
+ _poll->stop();
+ _poll->removeSockets();
+
+ // Async cleanup.
+ LOOLWSD::doHousekeeping();
LOG_INF("Finished docBroker polling thread for docKey [" << _docKey << "].");
return;
@@ -269,8 +276,7 @@ void DocumentBroker::pollThread()
if (ShutdownRequestFlag)
{
autoSave(true);
- _closeReason = "recycling";
- _stop = true;
+ stop("recycling");
}
else if (AutoSaveEnabled && !_stop &&
std::chrono::duration_cast<std::chrono::seconds>(now - last30SecCheckTime).count() >= 30)
@@ -288,8 +294,7 @@ void DocumentBroker::pollThread()
{
LOG_INF("Terminating " << (idle ? "idle" : "dead") <<
" DocumentBroker for docKey [" << getDocKey() << "].");
- _closeReason = (idle ? "idle" : "dead");
- _stop = true;
+ stop(idle ? "idle" : "dead");
}
}
@@ -374,8 +379,10 @@ void DocumentBroker::joinThread()
_poll->joinThread();
}
-void DocumentBroker::stop()
+void DocumentBroker::stop(const std::string& reason)
{
+ LOG_DBG("Closing DocumentBroker for docKey [" << _docKey << "] with reason: " << reason);
+ _closeReason = reason; // used later in the polling loop
_stop = true;
_poll->wakeup();
}
@@ -1553,7 +1560,7 @@ void DocumentBroker::terminateChild(const std::string& closeReason)
LOG_INF("Terminating doc [" << _docKey << "] with reason: " << closeReason);
- // Close all running sessions
+ // Close all running sessions first.
shutdownClients(closeReason);
if (_childProcess)
@@ -1566,7 +1573,7 @@ void DocumentBroker::terminateChild(const std::string& closeReason)
_childProcess->close(false);
}
- _stop = true;
+ stop(closeReason);
}
void DocumentBroker::closeDocument(const std::string& reason)
@@ -1574,8 +1581,7 @@ void DocumentBroker::closeDocument(const std::string& reason)
assertCorrectThread();
LOG_DBG("Closing DocumentBroker for docKey [" << _docKey << "] with reason: " << reason);
- _closeReason = reason; // used later in the polling loop
- stop();
+ stop(reason);
}
void DocumentBroker::broadcastMessage(const std::string& message)
diff --git a/wsd/DocumentBroker.hpp b/wsd/DocumentBroker.hpp
index 0b8153ad..1e8e0746 100644
--- a/wsd/DocumentBroker.hpp
+++ b/wsd/DocumentBroker.hpp
@@ -227,7 +227,7 @@ public:
void startThread();
/// Flag for termination.
- void stop();
+ void stop(const std::string& reason);
/// Thread safe termination of this broker if it has a lingering thread
void joinThread();
diff --git a/wsd/LOOLWSD.cpp b/wsd/LOOLWSD.cpp
index 0750a0b2..94b4c0d3 100644
--- a/wsd/LOOLWSD.cpp
+++ b/wsd/LOOLWSD.cpp
@@ -1528,7 +1528,7 @@ public:
if (docBroker)
{
// FIXME: No need to notify if asked to stop.
- docBroker->stop();
+ docBroker->stop("Request dispatcher destroyed.");
}
}
@@ -1556,7 +1556,7 @@ private:
auto lock = docBroker->getLock();
docBroker->assertCorrectThread();
docBroker->setCloseReason("docdisconnected");
- docBroker->stop();
+ docBroker->stop("Lost connection with LOKit.");
}
}
More information about the Libreoffice-commits
mailing list