Merge pull request #9035 from annando/daemon-cooldown
Adding a cooldown phase for the daemon
This commit is contained in:
commit
6e45db7bf2
2 changed files with 45 additions and 23 deletions
|
@ -185,7 +185,12 @@ while (true) {
|
|||
$do_cron = true;
|
||||
}
|
||||
|
||||
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.
|
||||
|
|
|
@ -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()]);
|
||||
|
|
Loading…
Reference in a new issue