[Libreoffice-commits] online.git: Branch 'private/Ashod/nonblocking' - common/SigUtil.cpp common/SigUtil.hpp wsd/Admin.cpp wsd/LOOLWSD.cpp wsd/LOOLWSD.hpp
Michael Meeks
michael.meeks at collabora.com
Sat Mar 4 17:37:06 UTC 2017
common/SigUtil.cpp | 77 +++++++++++++++++++----------------------------------
common/SigUtil.hpp | 12 ++------
wsd/Admin.cpp | 3 +-
wsd/LOOLWSD.cpp | 33 +++++++++++++++-------
wsd/LOOLWSD.hpp | 10 ++++++
5 files changed, 67 insertions(+), 68 deletions(-)
New commits:
commit d20c3a2db8c2b2e5550292fc9511c8e731793e84
Author: Michael Meeks <michael.meeks at collabora.com>
Date: Sat Mar 4 17:33:46 2017 +0000
Cleanup shutdown flag handling.
Pull the notification pieces out of SigUtil.cpp - not signal safe,
and invoked only from LOOLWSD anyway.
In a non-blocking world, the socket close notification sends are
instant - so more work required to count-down / timeout remaining
clients.
diff --git a/common/SigUtil.cpp b/common/SigUtil.cpp
index 0be2b70..5de5721 100644
--- a/common/SigUtil.cpp
+++ b/common/SigUtil.cpp
@@ -36,17 +36,15 @@
#include "Socket.hpp"
#include "Common.hpp"
#include "Log.hpp"
-#include "Util.hpp"
+/// Flag to request hard termination.
std::atomic<bool> TerminationFlag(false);
+/// Flag to request dumping of all internal state
std::atomic<bool> DumpGlobalState(false);
-std::mutex SigHandlerTrap;
-
-/// Flag to shutdown the server.
-std::atomic<bool> ShutdownFlag;
-
/// Flag to request WSD to notify clients and shutdown.
-static std::atomic<bool> ShutdownRequestFlag(false);
+std::atomic<bool> ShutdownRequestFlag(false);
+
+std::mutex SigHandlerTrap;
namespace SigUtil
{
@@ -113,36 +111,43 @@ namespace SigUtil
static
void handleTerminationSignal(const int signal)
{
- // FIXME: would love a socket in all SocketPolls to handle shutdown
- if (!ShutdownFlag && signal == SIGINT)
+ bool hardExit = false;
+ const char *domain;
+ if (!ShutdownRequestFlag && signal == SIGINT)
{
- Log::signalLogPrefix();
- Log::signalLog(" Shutdown signal received: ");
- Log::signalLog(signalName(signal));
- Log::signalLog("\n");
- SigUtil::requestShutdown();
- SocketPoll::wakeupWorld();
+ domain = " Shutdown signal received: ";
+ ShutdownRequestFlag = true;
}
else if (!TerminationFlag)
{
- Log::signalLogPrefix();
- Log::signalLog(" Forced-Termination signal received: ");
- Log::signalLog(signalName(signal));
- Log::signalLog("\n");
+ domain = " Forced-Termination signal received: ";
TerminationFlag = true;
- SocketPoll::wakeupWorld();
}
else
{
- Log::signalLogPrefix();
- Log::signalLog(" ok, ok - hard-termination signal received: ");
- Log::signalLog(signalName(signal));
- Log::signalLog("\n");
+ domain = " ok, ok - hard-termination signal received: ";
+ hardExit = true;
+ }
+ Log::signalLogPrefix();
+ Log::signalLog(domain);
+ Log::signalLog(signalName(signal));
+ Log::signalLog("\n");
+
+ if (!hardExit)
+ SocketPoll::wakeupWorld();
+ else
+ {
::signal (signal, SIG_DFL);
::raise (signal);
}
}
+ void requestShutdown()
+ {
+ ShutdownRequestFlag = true;
+ SocketPoll::wakeupWorld();
+ }
+
void setTerminationSignals()
{
struct sigaction action;
@@ -273,30 +278,6 @@ namespace SigUtil
sigaction(SIGUSR1, &action, nullptr);
}
-
- void requestShutdown()
- {
- ShutdownRequestFlag = true;
- }
-
- bool handleShutdownRequest()
- {
- if (ShutdownRequestFlag)
- {
- LOG_INF("Shutdown requested. Initiating WSD shutdown.");
- Util::alertAllUsers("close: shuttingdown");
- ShutdownFlag = true;
- return true;
- }
-
- return false;
- }
-
- bool isShuttingDown()
- {
- return ShutdownFlag;
- }
-
bool killChild(const int pid)
{
LOG_DBG("Killing PID: " << pid);
diff --git a/common/SigUtil.hpp b/common/SigUtil.hpp
index 9dabcfc..2b69578 100644
--- a/common/SigUtil.hpp
+++ b/common/SigUtil.hpp
@@ -13,6 +13,9 @@
#include <atomic>
#include <mutex>
+/// Flag to commence clean shutdown
+extern std::atomic<bool> ShutdownRequestFlag;
+
/// Flag to stop pump loops.
extern std::atomic<bool> TerminationFlag;
@@ -48,15 +51,6 @@ namespace SigUtil
/// then flags for shutdown.
void requestShutdown();
- /// Checks for shutdown request and,
- /// after notifying clients, flags for
- /// shutting down.
- /// Returns true if shutdown is requested.
- bool handleShutdownRequest();
-
- /// Returns true if Shutdown is in progress.
- bool isShuttingDown();
-
/// Kills a child process and returns true when
/// child pid is removed from the process table
/// after a certain (short) timeout.
diff --git a/wsd/Admin.cpp b/wsd/Admin.cpp
index b1e8c11..636c403 100644
--- a/wsd/Admin.cpp
+++ b/wsd/Admin.cpp
@@ -149,7 +149,8 @@ bool AdminRequestHandler::adminCommandHandler(const std::vector<char>& payload)
else if (tokens[0] == "shutdown")
{
LOG_INF("Shutdown requested by admin.");
- SigUtil::requestShutdown();
+ ShutdownRequestFlag = true;
+ SocketPoll::wakeupWorld();
return false;
}
else if (tokens[0] == "set" && tokens.count() > 1)
diff --git a/wsd/LOOLWSD.cpp b/wsd/LOOLWSD.cpp
index 8d9a3a4..8fdf280 100644
--- a/wsd/LOOLWSD.cpp
+++ b/wsd/LOOLWSD.cpp
@@ -1163,7 +1163,7 @@ private:
return session->handleInput(payload.data(), payload.size());
},
[&session]() { session->closeFrame(); },
- []() { return TerminationFlag || SigUtil::isShuttingDown(); });
+ []() { return TerminationFlag || isShuttingDown(); });
// Connection terminated. Destroy session.
LOG_DBG("Client session [" << id << "] on docKey [" << docKey << "] terminated. Cleaning up.");
@@ -1216,7 +1216,7 @@ private:
// respond close frame
ws->shutdown();
}
- else if (!SigUtil::isShuttingDown())
+ else if (!isShuttingDown())
{
// something wrong, with internal exceptions
LOG_TRC("Abnormal close handshake.");
@@ -3260,7 +3260,7 @@ private:
// respond with close frame
_clientSession->shutdown();
}
- else if (!SigUtil::isShuttingDown())
+ else if (!ShutdownRequestFlag)
{
// something wrong, with internal exceptions
LOG_TRC("Abnormal close handshake.");
@@ -3361,7 +3361,7 @@ public:
std::cerr << "LOOLWSDServer:\n"
<< " stop: " << _stop << "\n"
<< " TerminationFlag: " << TerminationFlag << "\n"
- << " isShuttingDown: " << SigUtil::isShuttingDown() << "\n";
+ << " isShuttingDown: " << ShutdownRequestFlag << "\n";
std::cerr << "Server poll:\n";
_serverPoll.dumpState();
@@ -3382,7 +3382,7 @@ private:
static void runServer(std::atomic<bool>& stop, SocketPoll& serverPoll) {
LOG_INF("Starting master server thread.");
- while (!stop && !TerminationFlag && !SigUtil::isShuttingDown())
+ while (!stop && !TerminationFlag && !ShutdownRequestFlag)
{
if (DumpGlobalState)
{
@@ -3395,7 +3395,7 @@ private:
static void runDocument(std::atomic<bool>& stop, SocketPoll& documentPoll) {
LOG_INF("Starting document thread.");
- while (!stop && !TerminationFlag && !SigUtil::isShuttingDown())
+ while (!stop && !TerminationFlag && !ShutdownRequestFlag)
{
documentPoll.poll(5000);
}
@@ -3436,6 +3436,19 @@ private:
LOOLWSDServer srv;
+bool LOOLWSD::handleShutdownRequest()
+{
+ if (ShutdownRequestFlag)
+ {
+ LOG_INF("Shutdown requested. Initiating WSD shutdown.");
+ Util::alertAllUsers("close: shuttingdown");
+ ShutdownFlag = true;
+ return true;
+ }
+
+ return false;
+}
+
int LOOLWSD::main(const std::vector<std::string>& /*args*/)
{
#ifndef FUZZER
@@ -3582,10 +3595,10 @@ int LOOLWSD::main(const std::vector<std::string>& /*args*/)
#endif
auto last30SecCheckTime = std::chrono::steady_clock::now();
- while (!TerminationFlag && !SigUtil::isShuttingDown())
+ while (!TerminationFlag && !ShutdownRequestFlag)
{
UnitWSD::get().invokeTest();
- if (TerminationFlag || SigUtil::handleShutdownRequest())
+ if (TerminationFlag || handleShutdownRequest())
{
break;
}
@@ -3663,7 +3676,7 @@ int LOOLWSD::main(const std::vector<std::string>& /*args*/)
// Stop the listening to new connections
// and wait until sockets close.
LOG_INF("Stopping server socket listening. ShutdownFlag: " <<
- SigUtil::isShuttingDown() << ", TerminationFlag: " << TerminationFlag);
+ ShutdownRequestFlag << ", TerminationFlag: " << TerminationFlag);
// Wait until documents are saved and sessions closed.
srv.stop();
@@ -3705,7 +3718,7 @@ int LOOLWSD::main(const std::vector<std::string>& /*args*/)
FileUtil::removeFile(path, true);
}
- if (SigUtil::isShuttingDown())
+ if (isShuttingDown())
{
// At this point there should be no other thread, but...
std::lock_guard<std::mutex> lock(ClientWebSocketsMutex);
diff --git a/wsd/LOOLWSD.hpp b/wsd/LOOLWSD.hpp
index 5126bb1..fee0091 100644
--- a/wsd/LOOLWSD.hpp
+++ b/wsd/LOOLWSD.hpp
@@ -51,6 +51,16 @@ public:
static std::atomic<unsigned> NumConnections;
static std::unique_ptr<TraceFileWriter> TraceDumper;
+ /// Flag to shutdown the server.
+ std::atomic<bool> ShutdownFlag;
+
+ bool isShuttingDown()
+ {
+ return ShutdownFlag;
+ }
+
+ bool handleShutdownRequest();
+
static std::string GenSessionId()
{
return Util::encodeId(++NextSessionId, 4);
More information about the Libreoffice-commits
mailing list