[Libreoffice-commits] online.git: loolwsd/LOOLBroker.cpp

Ashod Nakashian ashod.nakashian at collabora.co.uk
Sun Jan 24 13:12:12 PST 2016


 loolwsd/LOOLBroker.cpp |   19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)

New commits:
commit 75ede04cd7fd88e1113625f6497c00e485fa28dc
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Sun Jan 24 14:49:45 2016 -0500

    loolwsd: improved child forking
    
    Change-Id: Ic05b412bb9c467659c24cba12f385ed9c0c67b84
    Reviewed-on: https://gerrit.libreoffice.org/21758
    Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
    Tested-by: Ashod Nakashian <ashnakash at gmail.com>

diff --git a/loolwsd/LOOLBroker.cpp b/loolwsd/LOOLBroker.cpp
index ae2a5a7..77e8708 100644
--- a/loolwsd/LOOLBroker.cpp
+++ b/loolwsd/LOOLBroker.cpp
@@ -318,7 +318,7 @@ public:
             if ( nBytes < 0 )
             {
                 Log::error("Error sending search message to child pipe: " + std::to_string(it->first) + ". Terminating.");
-                removeChild(it->second);
+                removeChild(it->first);
                 it = _childProcesses.cbegin();
                 continue;
             }
@@ -329,7 +329,7 @@ public:
             if ( nBytes < 0 )
             {
                 Log::error("Error reading response to search message from child [" + std::to_string(it->first) + "]. Terminating.");
-                removeChild(it->second);
+                removeChild(it->first);
                 it = _childProcesses.cbegin();
                 continue;
             }
@@ -591,7 +591,7 @@ static int createLibreOfficeKit(const bool sharePages,
 
     Log::info() << "Adding Kit #" << childCounter << ", PID: " << child << Log::end;
     _childProcesses[child] = nFIFOWriter;
-    ++forkCounter;
+    --forkCounter;
     return child;
 }
 
@@ -847,17 +847,24 @@ int main(int argc, char** argv)
         {
             std::lock_guard<std::recursive_mutex> lock(forkMutex);
 
+            pipeHandler.verifyChilds();
+
             // Figure out how many children we need.
             const signed total = _childProcesses.size();
             const signed used = _cacheURL.size();
             const signed extra = total - used;
-            if (extra < numPreSpawnedChildren)
+            signed spawn = std::min(static_cast<int>(forkCounter), numPreSpawnedChildren);
+            Log::debug() << "Spawning " << spawn << " children. Current Total: " << total
+                         << ", used: " << used << ", extra: " << extra << Log::end;
+            do
             {
                 if (createLibreOfficeKit(sharePages, loSubPath, jailId) < 0)
                     Log::error("Error: fork failed.");
             }
-            else
-                forkCounter = 0;
+            while (--spawn > 0);
+
+            // We've done our best. If need more, retrying will bump the counter.
+            forkCounter = 0;
         }
 
         int status;


More information about the Libreoffice-commits mailing list