diff --git a/app/controllers/api/functions.php b/app/controllers/api/functions.php index 0edfa26eff..c73fbb686c 100644 --- a/app/controllers/api/functions.php +++ b/app/controllers/api/functions.php @@ -458,16 +458,10 @@ App::put('/v1/functions/:functionId') $enabled ??= $function->getAttribute('enabled', true); - $log = $schedule - ->setAttribute('resourceUpdatedAt', $function['resourceUpdatedAt']) - ->setAttribute('schedule', $function['schedule']) - ->setAttribute('active', !empty($function->getAttribute('schedule') || !empty($schedule))); - $function = $dbForProject->updateDocument('functions', $function->getId(), new Document(array_merge($function->getArrayCopy(), [ 'execute' => $execute, 'name' => $name, 'events' => $events, - 'scheduleId' => $log->getId(), 'schedule' => $schedule, 'scheduleUpdatedAt' => DateTime::now(), 'timeout' => $timeout, @@ -475,6 +469,15 @@ App::put('/v1/functions/:functionId') 'search' => implode(' ', [$functionId, $name, $function->getAttribute('runtime')]), ]))); + $log = $dbForConsole->getDocument('schedules', $function['scheduleId']); + + $log + ->setAttribute('resourceUpdatedAt', $function['scheduleUpdatedAt']) + ->setAttribute('schedule', $function['schedule']) + ->setAttribute('active', !empty($function->getAttribute('schedule')) && !empty($function->getAttribute('deployment'))); + + $dbForConsole->updateDocument('schedules', $log->getId(), $log); + $eventsInstance->setParam('functionId', $function->getId()); $response->dynamic($function, Response::MODEL_FUNCTION); @@ -527,9 +530,15 @@ App::patch('/v1/functions/:functionId/deployments/:deploymentId') 'deployment' => $deployment->getId() ]))); - $log = $dbForProject->getDocument('schedules', $function['resourceId']); + $log = $dbForConsole->getDocument('schedules', $function['scheduleId']); - $log->setAttribute('active', true); + $active = !empty($function->getAttribute('schedule')); + + if ($active) { + $log->setAttribute('resourceUpdatedAt', datetime::now()); + } + + $log->setAttribute('active', $active); Authorization::skip(function () use ($dbForConsole, $log) { $dbForConsole->updateDocument('schedules', $log->getId(), $log); @@ -574,7 +583,7 @@ App::delete('/v1/functions/:functionId') throw new Exception(Exception::GENERAL_SERVER_ERROR, 'Failed to remove function from DB'); } - $log = $dbForProject->getDocument('schedules', $function['resourceId']); + $log = $dbForConsole->getDocument('schedules', $function['scheduleId']); $log ->setAttribute('resourceUpdatedAt', DateTime::now()) @@ -774,9 +783,19 @@ App::post('/v1/functions/:functionId/deployments') } } - $log = $dbForProject->getDocument('schedules', $function['resourceId']); + /** + * TODO Should we update also the function collection with the scheduleUpdatedAt attr? + */ - $log->setAttribute('active', true); + $log = $dbForConsole->getDocument('schedules', $function['scheduleId']); + + $active = !empty($function->getAttribute('schedule')); + + if ($active) { + $log->setAttribute('resourceUpdatedAt', datetime::now()); + } + + $log->setAttribute('active', $active); Authorization::skip(function () use ($dbForConsole, $log) { $dbForConsole->updateDocument('schedules', $log->getId(), $log); diff --git a/app/tasks/schedule.php b/app/tasks/schedule.php index 4664c8c10f..b86d5a286d 100644 --- a/app/tasks/schedule.php +++ b/app/tasks/schedule.php @@ -1,5 +1,6 @@ task('schedule') ->desc('Function scheduler task') @@ -23,6 +26,7 @@ $cli Console::success(APP_NAME . ' Scheduler v1 has started'); $createQueue = function () use (&$functions, &$queue) { + $loadStart = \microtime(true); /** * Creating smaller functions list containing 5-min timeframe. */ @@ -34,6 +38,9 @@ $cli $queue[$next][$function['resourceId']] = $function; } } + $loadEnd = \microtime(true); + Console::error("Queue was built in " . ($loadEnd - $loadStart) . " seconds"); + }; $removeFromQueue = function ($scheduleId) use (&$queue) { @@ -49,12 +56,13 @@ $cli $dbForConsole = getConsoleDB(); - $count = 0; - $limit = 50; + $limit = 200; $sum = $limit; $functions = []; $queue = []; - + $count = 0; + $loadStart = \microtime(true); + $total = 0; /** * Initial run fill $functions list */ @@ -63,17 +71,24 @@ $cli Query::equal('region', [App::getEnv('_APP_REGION')]), Query::equal('resourceType', ['function']), Query::equal('active', [true]), - Query::limit($limit) + Query::offset($count * $limit), + Query::limit($limit), ]); $sum = count($results); + + $total = $total + $sum; foreach ($results as $document) { $functions[$document['resourceId']] = $document; - $count++; } + $count++; } + $loadEnd = \microtime(true); + Console::error("{$total} functions where loaded in " . ($loadEnd - $loadStart) . " seconds"); + $createQueue(); + $lastUpdate = DateTime::addSeconds(new \DateTime(), -FUNCTION_VALIDATION_TIMER); Co\run( @@ -88,12 +103,13 @@ $cli /** * Updating functions list from DB. */ - while ($sum === $limit) { + while (!empty($sum)) { $results = $dbForConsole->find('schedules', [ Query::equal('region', [App::getEnv('_APP_REGION')]), Query::equal('resourceType', ['function']), Query::greaterThan('resourceUpdatedAt', $lastUpdate), - Query::limit($limit) + Query::limit($limit), + Query::offset($count * $limit), ]); $sum = count($results); foreach ($results as $document) { @@ -107,8 +123,8 @@ $cli $functions[$document['resourceId']] = $document; } $removeFromQueue($document['resourceId']); - $count++; } + $count++; } $lastUpdate = DateTime::now(); diff --git a/docker-compose.yml b/docker-compose.yml index 0dac1dc094..045e70dec6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -108,7 +108,7 @@ services: - ./public:/usr/src/code/public - ./src:/usr/src/code/src - ./dev:/usr/local/dev - - ./vendor/utopia-php/database:/usr/src/code/vendor/utopia-php/database + #- ./vendor/utopia-php/database:/usr/src/code/vendor/utopia-php/database depends_on: - mariadb - redis