loolwsd/Common.hpp | 2 +- loolwsd/LOOLWSD.cpp | 24 +++++++++++++----------- 2 files changed, 14 insertions(+), 12 deletions(-)
New commits: commit de5f77c00fca275361a403f222e8025eaa3b346c Author: Ashod Nakashian <ashod.nakash...@collabora.co.uk> Date: Thu May 12 10:43:13 2016 -0400 loolwsd: better child management Change-Id: I0de190619008834f096517bd1cfafcdc83261f47 Reviewed-on: https://gerrit.libreoffice.org/24933 Reviewed-by: Ashod Nakashian <ashnak...@gmail.com> Tested-by: Ashod Nakashian <ashnak...@gmail.com> diff --git a/loolwsd/Common.hpp b/loolwsd/Common.hpp index caa3ce0..f0be984 100644 --- a/loolwsd/Common.hpp +++ b/loolwsd/Common.hpp @@ -17,7 +17,7 @@ constexpr int MAX_SESSIONS = 1024; constexpr int DEFAULT_CLIENT_PORT_NUMBER = 9980; constexpr int DEFAULT_MASTER_PORT_NUMBER = 9981; constexpr int WSD_SLEEP_SECS = 2; -constexpr int CHILD_TIMEOUT_SECS = 10; +constexpr int CHILD_TIMEOUT_SECS = 4; constexpr int POLL_TIMEOUT_MS = 1000; constexpr int COMMAND_TIMEOUT_MS = 5000; diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp index f2b47ad..bf8b674 100644 --- a/loolwsd/LOOLWSD.cpp +++ b/loolwsd/LOOLWSD.cpp @@ -149,7 +149,7 @@ static bool NoCapsForKit = false; static std::vector<std::shared_ptr<ChildProcess>> newChildren; static std::mutex newChildrenMutex; static std::condition_variable newChildrenCV; -static std::chrono::steady_clock::time_point lastForkRequestTime; +static std::chrono::steady_clock::time_point lastForkRequestTime = std::chrono::steady_clock::now(); static std::map<std::string, std::shared_ptr<DocumentBroker>> docBrokers; static std::mutex docBrokersMutex; // Sessions to pre-spawned child processes that have connected but are not yet assigned a @@ -194,13 +194,7 @@ static void prespawnChildren() return; } - const auto duration = (std::chrono::steady_clock::now() - lastForkRequestTime); - if (std::chrono::duration_cast<std::chrono::milliseconds>(duration).count() <= CHILD_TIMEOUT_SECS * 1000) - { - // Not enough time passed to balance children. - return; - } - + // Do the cleanup first. for (int i = newChildren.size() - 1; i >= 0; --i) { if (!newChildren[i]->isAlive()) @@ -209,6 +203,13 @@ static void prespawnChildren() } } + const auto duration = (std::chrono::steady_clock::now() - lastForkRequestTime); + if (std::chrono::duration_cast<std::chrono::milliseconds>(duration).count() <= CHILD_TIMEOUT_SECS * 1000) + { + // Not enough time passed to balance children. + return; + } + const int available = newChildren.size(); int balance = LOOLWSD::NumPreSpawnedChildren; balance -= available; @@ -263,11 +264,11 @@ static std::shared_ptr<ChildProcess> getNewChild() Log::debug("getNewChild: Returning new child [" + std::to_string(child->getPid()) + "]."); return child; } - - Log::debug("getNewChild: No live child, forking more."); } + + Log::debug("getNewChild: No live child, forking more."); } - while (chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now() - startTime).count() < CHILD_TIMEOUT_SECS * 2000); + while (chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now() - startTime).count() < CHILD_TIMEOUT_SECS * 4000); Log::debug("getNewChild: Timed out while waiting for new child."); return nullptr; @@ -1452,6 +1453,7 @@ Process::PID LOOLWSD::createForKit() Log::info("Launching forkit process: " + forKitPath + " " + Poco::cat(std::string(" "), args.begin(), args.end())); + lastForkRequestTime = std::chrono::steady_clock::now(); ProcessHandle child = Process::launch(forKitPath, args); return child.id(); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits