[Libreoffice-commits] online.git: Branch 'distro/collabora/collabora-online-3' - wsd/Admin.cpp wsd/Admin.hpp
Michael Meeks
michael.meeks at collabora.com
Thu May 24 10:13:51 UTC 2018
wsd/Admin.cpp | 39 ++++++++++++++++++++++++++++++++++-----
wsd/Admin.hpp | 11 ++++++++++-
2 files changed, 44 insertions(+), 6 deletions(-)
New commits:
commit f096d34f6fea0720b1f7415f4922c8e5414bb9ad
Author: Michael Meeks <michael.meeks at collabora.com>
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 <kendy at collabora.com>
Tested-by: Jan Holesovsky <kendy at collabora.com>
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;
More information about the Libreoffice-commits
mailing list