[Libreoffice-commits] online.git: wsd/LOOLWSD.cpp

Ashod Nakashian ashod.nakashian at collabora.co.uk
Mon Jan 2 06:10:15 UTC 2017


 wsd/LOOLWSD.cpp |   16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

New commits:
commit 46ef41a6874ad6acc1a1761dc0e54483acd6dceb
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Sun Jan 1 16:02:38 2017 -0500

    wsd: force spawning children on startup
    
    Otherwise we throttle spawning to allow
    time to fork the process. If we don't wait
    we can bomb a loaded server and bring it down.
    
    However during startup this is not necessary
    as there are no in-flight spawn requests.
    
    Change-Id: I1beac94571f6d8d96136d32c81310bea6547242b
    Reviewed-on: https://gerrit.libreoffice.org/32622
    Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
    Tested-by: Ashod Nakashian <ashnakash at gmail.com>

diff --git a/wsd/LOOLWSD.cpp b/wsd/LOOLWSD.cpp
index 02a27c9..2fb7987 100644
--- a/wsd/LOOLWSD.cpp
+++ b/wsd/LOOLWSD.cpp
@@ -343,7 +343,7 @@ static bool cleanupChildren()
     return removed;
 }
 
-static void rebalanceChildren(int balance);
+static void rebalanceChildren(int balance, const bool force);
 
 /// Called on startup only.
 static void preForkChildren()
@@ -355,7 +355,7 @@ static void preForkChildren()
     UnitWSD::get().preSpawnCount(numPreSpawn);
 
     --numPreSpawn; // ForKit always spawns one child at startup.
-    rebalanceChildren(numPreSpawn);
+    rebalanceChildren(numPreSpawn, true); // Force on startup.
 
     // Wait until we have at least one child.
     const auto timeout = std::chrono::milliseconds(CHILD_TIMEOUT_MS);
@@ -364,7 +364,7 @@ static void preForkChildren()
 
 /// Proactively spawn children processes
 /// to load documents with alacrity.
-static void prespawnChildren()
+static void prespawnChildren(const bool force)
 {
     // First remove dead DocBrokers, if possible.
     std::unique_lock<std::mutex> docBrokersLock(DocBrokersMutex);
@@ -378,10 +378,10 @@ static void prespawnChildren()
     }
 
     const int numPreSpawn = LOOLWSD::NumPreSpawnedChildren;
-    rebalanceChildren(numPreSpawn);
+    rebalanceChildren(numPreSpawn, force);
 }
 
-static void rebalanceChildren(int balance)
+static void rebalanceChildren(int balance, const bool force)
 {
     Util::assertIsLocked(DocBrokersMutex);
     Util::assertIsLocked(NewChildrenMutex);
@@ -402,7 +402,7 @@ static void rebalanceChildren(int balance)
     balance -= available;
     balance -= OutstandingForks;
 
-    if (balance > 0 && (rebalance || durationMs >= CHILD_TIMEOUT_MS))
+    if (balance > 0 && (force || rebalance || durationMs >= CHILD_TIMEOUT_MS))
     {
         LOG_DBG("prespawnChildren: Have " << available << " spare " <<
                 (available == 1 ? "child" : "children") <<
@@ -437,7 +437,7 @@ static std::shared_ptr<ChildProcess> getNewChild()
     {
         int numPreSpawn = LOOLWSD::NumPreSpawnedChildren;
         ++numPreSpawn; // Replace the one we'll dispatch just now.
-        rebalanceChildren(numPreSpawn);
+        rebalanceChildren(numPreSpawn, false);
 
         const auto timeout = chrono::milliseconds(CHILD_TIMEOUT_MS);
         if (NewChildrenCV.wait_for(lock, timeout, []() { return !NewChildren.empty(); }))
@@ -2205,7 +2205,7 @@ int LOOLWSD::main(const std::vector<std::string>& /*args*/)
             }
 
             // Make sure we have sufficient reserves.
-            prespawnChildren();
+            prespawnChildren(false);
         }
 
 #if ENABLE_DEBUG


More information about the Libreoffice-commits mailing list