Adding a cooldown phase for the daemon
This commit is contained in:
parent
5c3d077dfb
commit
98dd15ec9a
2 changed files with 45 additions and 23 deletions
|
@ -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.
|
||||||
|
|
|
@ -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()]);
|
||||||
|
|
Loading…
Reference in a new issue