From e932f0854786c7624462b2ec40becf0765149c0a Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Mon, 25 Sep 2017 03:44:44 +0200 Subject: [PATCH] Ref T161, network watchdog calls ping service --- src/blackcore/application.cpp | 14 ++++++++++++ src/blackcore/application.h | 4 ++++ src/blackcore/db/networkwatchdog.cpp | 34 ++++++++++++++++++++++++++++ src/blackcore/db/networkwatchdog.h | 25 ++++++++++++++++++++ 4 files changed, 77 insertions(+) diff --git a/src/blackcore/application.cpp b/src/blackcore/application.cpp index e8f9baace..3d8e8e7f1 100644 --- a/src/blackcore/application.cpp +++ b/src/blackcore/application.cpp @@ -690,6 +690,12 @@ namespace BlackCore return m_networkWatchDog.data(); } + void CApplication::setSwiftDbAccessibility(bool accessible) + { + if (!m_networkWatchDog) { return; } + m_networkWatchDog->setDbAccessibility(accessible); + } + int CApplication::triggerNetworkChecks() { if (!m_networkWatchDog) { return -1; } @@ -889,6 +895,14 @@ namespace BlackCore void CApplication::gracefulShutdown() { if (m_shutdown) { return; } + + // before marked as shutdown + if (m_networkWatchDog) + { + m_networkWatchDog->gracefulShutdown(); + } + + // mark as shutdown m_shutdown = true; // save settings (but only when application was really alive) diff --git a/src/blackcore/application.h b/src/blackcore/application.h index 842c49b16..b1c68c5f0 100644 --- a/src/blackcore/application.h +++ b/src/blackcore/application.h @@ -162,6 +162,10 @@ namespace BlackCore //! \remark mostly for UNIT tests etc, normally not meant to be used directly Db::CNetworkWatchdog *getNetworkWatchdog() const; + //! Allows to mark the DB as "up" or "down" + //! \see BlackCore::Db::CNetworkWatchdog::setDbAccessibility + void setSwiftDbAccessibility(bool accessible); + //! \copydoc BlackCore::Db::CNetworkWatchdog::triggerCheck int triggerNetworkChecks(); diff --git a/src/blackcore/db/networkwatchdog.cpp b/src/blackcore/db/networkwatchdog.cpp index 206d2848a..91d36eac2 100644 --- a/src/blackcore/db/networkwatchdog.cpp +++ b/src/blackcore/db/networkwatchdog.cpp @@ -9,10 +9,13 @@ #include "networkwatchdog.h" #include "application.h" +#include "blackcore/data/globalsetup.h" #include "blackmisc/network/networkutils.h" +#include using namespace BlackMisc; using namespace BlackMisc::Network; +using namespace BlackCore::Data; namespace BlackCore { @@ -168,6 +171,37 @@ namespace BlackCore } } + void CNetworkWatchdog::gracefulShutdown() + { + this->pingDbClientService(PingCompleteShutdown); + } + + void CNetworkWatchdog::pingDbClientService(CNetworkWatchdog::PingType type) + { + if (!this->isSwiftDbAccessible()) { return; } + if (!sApp) { return; } + const CGlobalSetup gs = sApp->getGlobalSetup(); + if (!gs.wasLoaded()) { return; } + CUrl pingUrl = gs.getDbClientPingServiceUrl(); + if (pingUrl.isEmpty()) { return; } + + pingUrl.appendQuery("uuid", this->identifier().toUuidString()); + pingUrl.appendQuery("application", sApp->getApplicationNameAndVersion()); + if (type.testFlag(PingLogoff)) { pingUrl.appendQuery("logoff", "true"); } + if (type.testFlag(PingShutdown)) { pingUrl.appendQuery("shutdown", "true"); } + if (type.testFlag(PingStarted)) { pingUrl.appendQuery("started", "true"); } + + sApp->getFromNetwork(pingUrl, { this, &CNetworkWatchdog::replyPingClientService }); + } + + void CNetworkWatchdog::replyPingClientService(QNetworkReply *nwReply) + { + QScopedPointer nw(nwReply); // delete reply + if (!sApp || sApp->isShuttingDown()) { return; } + const bool ok = nw->error() == QNetworkReply::NoError; + this->setDbAccessibility(ok); + } + void CNetworkWatchdog::triggerChangedSignals(bool oldDbAccessible, bool oldInternetAccessible) { if (!this->doWorkCheck()) { return; } diff --git a/src/blackcore/db/networkwatchdog.h b/src/blackcore/db/networkwatchdog.h index 0129108ff..47d9fd894 100644 --- a/src/blackcore/db/networkwatchdog.h +++ b/src/blackcore/db/networkwatchdog.h @@ -79,6 +79,23 @@ namespace BlackCore //! Network status changed, use this function to inform the watchdog void onChangedNetworkAccessibility(QNetworkAccessManager::NetworkAccessibility accessible); + //! Graceful shutdown + void gracefulShutdown(); + + //! Add info when pinging + enum PingTypeFlag + { + PingUnspecific = 0, + PingLogoff = 1 << 0, + PingStarted = 1 << 1, + PingShutdown = 1 << 2, + PingCompleteShutdown = PingLogoff | PingShutdown + }; + Q_DECLARE_FLAGS(PingType, PingTypeFlag) + + //! Ping the DB server, fire and forget (no feedback etc) + void pingDbClientService(PingType type = PingUnspecific); + //! URL referring to the DB //! \remark depends on BlackCore::Application::getGlobalSetup() static bool isDbUrl(const BlackMisc::Network::CUrl &url); @@ -103,6 +120,9 @@ namespace BlackCore //! Init a working shared URL void initWorkingSharedUrlFromSetup(); + //! Received reply of client service ping + void replyPingClientService(QNetworkReply *nwReply); + //! The URL being tested //! \remark depends on BlackCore::Application::getGlobalSetup() static BlackMisc::Network::CUrl dbTestUrl(); @@ -127,4 +147,9 @@ namespace BlackCore }; } // ns } // ns + +Q_DECLARE_METATYPE(BlackCore::Db::CNetworkWatchdog::PingTypeFlag) +Q_DECLARE_METATYPE(BlackCore::Db::CNetworkWatchdog::PingType) +Q_DECLARE_OPERATORS_FOR_FLAGS(BlackCore::Db::CNetworkWatchdog::PingType) + #endif // guard