wsd/Admin.cpp | 39 ++++++++++++++++++++++++++++++++++----- wsd/Admin.hpp | 11 ++++++++++- 2 files changed, 44 insertions(+), 6 deletions(-)
New commits: commit f096d34f6fea0720b1f7415f4922c8e5414bb9ad Author: Michael Meeks <[email protected]> Date: Fri May 18 17:35:19 2018 +0100 If a monitor is dis-connected, try to re-connect it. Change-Id: I04f254acfe823f07e7fb11b277e661c09e146ebd Reviewed-on: https://gerrit.libreoffice.org/54658 Reviewed-by: Jan Holesovsky <[email protected]> Tested-by: Jan Holesovsky <[email protected]> diff --git a/wsd/Admin.cpp b/wsd/Admin.cpp index 0c195e419..86db6153a 100644 --- a/wsd/Admin.cpp +++ b/wsd/Admin.cpp @@ -443,6 +443,17 @@ void Admin::pollingThread() netWait += _networkStatsIntervalMs; } + // (re)-connect (with sync. DNS - urk) to one monitor at a time + if (_pendingConnects.size()) + { + MonitorConnectRecord rec = _pendingConnects[0]; + if (rec._when < now) + { + _pendingConnects.erase(_pendingConnects.begin()); + connectToMonitorSync(rec._uri); + } + } + // Handle websockets & other work. const int timeout = std::max(std::min(std::min(cpuWait, memWait), netWait), MinStatsIntervalMs); LOG_TRC("Admin poll for " << timeout << "ms."); @@ -629,11 +640,13 @@ void Admin::dumpState(std::ostream& os) class MonitorSocketHandler : public AdminSocketHandler { bool _connecting; + std::string _uri; public: - MonitorSocketHandler(Admin *admin) : + MonitorSocketHandler(Admin *admin, const std::string &uri) : AdminSocketHandler(admin), - _connecting(true) + _connecting(true), + _uri(uri) { } int getPollEvents(std::chrono::steady_clock::time_point now, @@ -654,11 +667,27 @@ public: _connecting = false; return AdminSocketHandler::performWrites(); } + + void onDisconnect() override + { + LOG_WRN("Monitor " << _uri << " dis-connected, re-trying in 20 seconds"); + Admin::instance().scheduleMonitorConnect(_uri, std::chrono::steady_clock::now() + std::chrono::seconds(20)); + } }; -void Admin::connectToMonitor(const Poco::URI &uri) +void Admin::connectToMonitorSync(const std::string &uri) +{ + insertNewWebSocketSync(Poco::URI(uri), std::make_shared<MonitorSocketHandler>(this, uri)); +} + +void Admin::scheduleMonitorConnect(const std::string &uri, std::chrono::steady_clock::time_point when) { - insertNewWebSocketSync(uri, std::make_shared<MonitorSocketHandler>(this)); + assertCorrectThread(); + + MonitorConnectRecord todo; + todo._when = when; + todo._uri = uri; + _pendingConnects.push_back(todo); } void Admin::start() @@ -677,7 +706,7 @@ void Admin::start() Poco::URI monitor(uri); if (monitor.getScheme() == "wss" || monitor.getScheme() == "ws") { - addCallback([=] { connectToMonitor(monitor); } ); + addCallback([=] { scheduleMonitorConnect(uri, std::chrono::steady_clock::now()); }); haveMonitors = true; } else diff --git a/wsd/Admin.hpp b/wsd/Admin.hpp index af63db439..64dedbc20 100644 --- a/wsd/Admin.hpp +++ b/wsd/Admin.hpp @@ -116,6 +116,9 @@ public: notifyForkit(); } + /// Attempt a synchronous connection to a monitor with @uri @when that future comes + void scheduleMonitorConnect(const std::string &uri, std::chrono::steady_clock::time_point when); + private: /// Notify Forkit of changed settings. void notifyForkit(); @@ -125,7 +128,7 @@ private: void triggerMemoryCleanup(size_t hardModeLimit); /// Synchronous connection setup to remote monitoring server - void connectToMonitor(const Poco::URI &uri); + void connectToMonitorSync(const std::string &uri); private: /// The model is accessed only during startup & in @@ -140,6 +143,12 @@ private: size_t _totalSysMem; size_t _totalAvailMem; + struct MonitorConnectRecord { + std::chrono::steady_clock::time_point _when; + std::string _uri; + }; + std::vector<MonitorConnectRecord> _pendingConnects; + std::atomic<int> _memStatsTaskIntervalMs; std::atomic<int> _cpuStatsTaskIntervalMs; std::atomic<int> _networkStatsIntervalMs; _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
