[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