X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FCore%2FWorker.php;h=723cd809da44d3230721afd1eb4e06cf5a17ffb7;hb=389685e09944e3823effd2e820ab2fd95d8b4b32;hp=3400f00ae1755229a24a20e16fc6844f1c7592c5;hpb=834422d52f0b34fb088f79ac2704c3d514802d8e;p=friendica.git diff --git a/src/Core/Worker.php b/src/Core/Worker.php index 3400f00ae1..723cd809da 100644 --- a/src/Core/Worker.php +++ b/src/Core/Worker.php @@ -8,6 +8,7 @@ use Friendica\Database\DBA; use Friendica\Model\Process; use Friendica\Util\DateTimeFormat; use Friendica\Util\Network; +use Friendica\BaseObject; require_once 'include/dba.php'; @@ -62,7 +63,7 @@ class Worker } // Do we have too few memory? - if ($a->min_memory_reached()) { + if ($a->isMinMemoryReached()) { logger('Pre check: Memory limit reached, quitting.', LOGGER_DEBUG); return; } @@ -122,7 +123,7 @@ class Worker } // Check free memory - if ($a->min_memory_reached()) { + if ($a->isMinMemoryReached()) { logger('Memory limit reached, quitting.', LOGGER_DEBUG); Lock::release('worker'); return; @@ -152,7 +153,8 @@ class Worker */ private static function totalEntries() { - return DBA::count('workerqueue', ["`executed` <= ? AND NOT `done`", NULL_DATE]); + return DBA::count('workerqueue', ["`executed` <= ? AND NOT `done` AND `next_try` < ?", + NULL_DATE, DateTimeFormat::utcNow()]); } /** @@ -162,7 +164,7 @@ class Worker */ private static function highestPriority() { - $condition = ["`executed` <= ? AND NOT `done`", NULL_DATE]; + $condition = ["`executed` <= ? AND NOT `done` AND `next_try` < ?", NULL_DATE, DateTimeFormat::utcNow()]; $workerqueue = DBA::selectFirst('workerqueue', ['priority'], $condition, ['order' => ['priority']]); if (DBA::isResult($workerqueue)) { return $workerqueue["priority"]; @@ -180,7 +182,8 @@ class Worker */ private static function processWithPriorityActive($priority) { - $condition = ["`priority` <= ? AND `executed` > ? AND NOT `done`", $priority, NULL_DATE]; + $condition = ["`priority` <= ? AND `executed` > ? AND NOT `done` AND `next_try` < ?", + $priority, NULL_DATE, DateTimeFormat::utcNow()]; return DBA::exists('workerqueue', $condition); } @@ -240,7 +243,7 @@ class Worker self::execFunction($queue, $include, $argv, true); $stamp = (float)microtime(true); - if (DBA::update('workerqueue', ['done' => true], ['id' => $queue["id"]])) { + if (DBA::update('workerqueue', ['done' => true], ['id' => $queue['id']])) { Config::set('system', 'last_worker_execution', DateTimeFormat::utcNow()); } self::$db_duration = (microtime(true) - $stamp); @@ -618,7 +621,7 @@ class Worker $active = self::activeWorkers(); // Decrease the number of workers at higher load - $load = current_load(); + $load = System::currentLoad(); if ($load) { $maxsysload = intval(Config::get("system", "maxloadavg", 50)); @@ -805,7 +808,8 @@ class Worker $result = DBA::select( 'workerqueue', ['id'], - ["`executed` <= ? AND `priority` < ? AND NOT `done`", NULL_DATE, $highest_priority], + ["`executed` <= ? AND `priority` < ? AND NOT `done` AND `next_try` < ?", + NULL_DATE, $highest_priority, DateTimeFormat::utcNow()], ['limit' => $limit, 'order' => ['priority', 'created']] ); @@ -821,7 +825,8 @@ class Worker $result = DBA::select( 'workerqueue', ['id'], - ["`executed` <= ? AND `priority` > ? AND NOT `done`", NULL_DATE, $highest_priority], + ["`executed` <= ? AND `priority` > ? AND NOT `done` AND `next_try` < ?", + NULL_DATE, $highest_priority, DateTimeFormat::utcNow()], ['limit' => $limit, 'order' => ['priority', 'created']] ); @@ -840,7 +845,8 @@ class Worker $result = DBA::select( 'workerqueue', ['id'], - ["`executed` <= ? AND NOT `done`", NULL_DATE], + ["`executed` <= ? AND NOT `done` AND `next_try` < ?", + NULL_DATE, DateTimeFormat::utcNow()], ['limit' => $limit, 'order' => ['priority', 'created']] ); @@ -1116,6 +1122,35 @@ class Worker return true; } + /** + * Defers the current worker entry + */ + public static function defer() + { + if (empty(BaseObject::getApp()->queue)) { + return; + } + + $queue = BaseObject::getApp()->queue; + + $retrial = $queue['retrial']; + $id = $queue['id']; + + if ($retrial > 14) { + logger('Id ' . $id . ' had been tried 14 times, it will be deleted now.', LOGGER_DEBUG); + DBA::delete('workerqueue', ['id' => $id]); + } + + // Calculate the delay until the next trial + $delay = (($retrial + 3) ** 4) + (rand(1, 30) * ($retrial + 1)); + $next = DateTimeFormat::utc('now + ' . $delay . ' seconds'); + + logger('Defer execution ' . $retrial . ' of id ' . $id . ' to ' . $next, LOGGER_DEBUG); + + $fields = ['retrial' => $retrial + 1, 'next_try' => $next, 'executed' => NULL_DATE, 'pid' => 0]; + DBA::update('workerqueue', $fields, ['id' => $id]); + } + /** * Log active processes into the "process" table *