From 98dd15ec9a79a59ea44520c9094de4ab2372e34e Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 19 Aug 2020 18:21:40 +0000 Subject: [PATCH] Adding a cooldown phase for the daemon --- bin/daemon.php | 7 +++++- src/Core/Worker.php | 61 +++++++++++++++++++++++++++++---------------- 2 files changed, 45 insertions(+), 23 deletions(-) diff --git a/bin/daemon.php b/bin/daemon.php index c2ce05c8e0..596f4de56f 100755 --- a/bin/daemon.php +++ b/bin/daemon.php @@ -185,7 +185,12 @@ while (true) { $do_cron = true; } - Worker::spawnWorker($do_cron); + if ($do_cron || (!DI::process()->isMaxLoadReached() && Worker::entriesExists() && Worker::isReady())) { + Worker::spawnWorker($do_cron); + } else { + Logger::info('Cool down', ['pid' => $pid]); + sleep(10); + } if ($do_cron) { // We force a reconnect of the database connection. diff --git a/src/Core/Worker.php b/src/Core/Worker.php index c9a8bcbdda..1cde61351c 100644 --- a/src/Core/Worker.php +++ b/src/Core/Worker.php @@ -81,27 +81,8 @@ class Worker self::killStaleWorkers(); } - // Count active workers and compare them with a maximum value that depends on the load - if (self::tooMuchWorkers()) { - Logger::info('Pre check: Active worker limit reached, quitting.'); - return; - } - - // Do we have too few memory? - if (DI::process()->isMinMemoryReached()) { - Logger::info('Pre check: Memory limit reached, quitting.'); - return; - } - - // Possibly there are too much database connections - if (self::maxConnectionsReached()) { - Logger::info('Pre check: maximum connections reached, quitting.'); - return; - } - - // Possibly there are too much database processes that block the system - if (DI::process()->isMaxProcessesReached()) { - Logger::info('Pre check: maximum processes reached, quitting.'); + // Check if the system is ready + if (!self::isReady()) { return; } @@ -174,13 +155,49 @@ class Worker Logger::info("Couldn't select a workerqueue entry, quitting process", ['pid' => getmypid()]); } + /** + * Checks if the system is ready. + * + * Several system parameters like memory, connections and processes are checked. + * + * @return boolean + */ + public static function isReady() + { + // Count active workers and compare them with a maximum value that depends on the load + if (self::tooMuchWorkers()) { + Logger::info('Active worker limit reached, quitting.'); + return false; + } + + // Do we have too few memory? + if (DI::process()->isMinMemoryReached()) { + Logger::info('Memory limit reached, quitting.'); + return false; + } + + // Possibly there are too much database connections + if (self::maxConnectionsReached()) { + Logger::info('Maximum connections reached, quitting.'); + return false; + } + + // Possibly there are too much database processes that block the system + if (DI::process()->isMaxProcessesReached()) { + Logger::info('Maximum processes reached, quitting.'); + return false; + } + + return true; + } + /** * Check if non executed tasks do exist in the worker queue * * @return boolean Returns "true" if tasks are existing * @throws \Exception */ - private static function entriesExists() + public static function entriesExists() { $stamp = (float)microtime(true); $exists = DBA::exists('workerqueue', ["NOT `done` AND `pid` = 0 AND `next_try` < ?", DateTimeFormat::utcNow()]);