Adding a cooldown phase for the daemon

This commit is contained in:
Michael 2020-08-19 18:21:40 +00:00
parent 5c3d077dfb
commit 98dd15ec9a
2 changed files with 45 additions and 23 deletions

View File

@ -185,7 +185,12 @@ while (true) {
$do_cron = 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) { if ($do_cron) {
// We force a reconnect of the database connection. // We force a reconnect of the database connection.

View File

@ -81,27 +81,8 @@ class Worker
self::killStaleWorkers(); self::killStaleWorkers();
} }
// Count active workers and compare them with a maximum value that depends on the load // Check if the system is ready
if (self::tooMuchWorkers()) { if (!self::isReady()) {
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.');
return; return;
} }
@ -174,13 +155,49 @@ class Worker
Logger::info("Couldn't select a workerqueue entry, quitting process", ['pid' => getmypid()]); 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 * Check if non executed tasks do exist in the worker queue
* *
* @return boolean Returns "true" if tasks are existing * @return boolean Returns "true" if tasks are existing
* @throws \Exception * @throws \Exception
*/ */
private static function entriesExists() public static function entriesExists()
{ {
$stamp = (float)microtime(true); $stamp = (float)microtime(true);
$exists = DBA::exists('workerqueue', ["NOT `done` AND `pid` = 0 AND `next_try` < ?", DateTimeFormat::utcNow()]); $exists = DBA::exists('workerqueue', ["NOT `done` AND `pid` = 0 AND `next_try` < ?", DateTimeFormat::utcNow()]);