From f02bf6ac5a2e5d3be03f13f128e5ca70ec9a513d Mon Sep 17 00:00:00 2001 From: loks0n <22452787+loks0n@users.noreply.github.com> Date: Thu, 18 Jul 2024 13:03:24 +0100 Subject: [PATCH] feat: use coroutines delay system --- .../Platform/Tasks/ScheduleExecutions.php | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/src/Appwrite/Platform/Tasks/ScheduleExecutions.php b/src/Appwrite/Platform/Tasks/ScheduleExecutions.php index 2fdbd98da3..e7364c7a4b 100644 --- a/src/Appwrite/Platform/Tasks/ScheduleExecutions.php +++ b/src/Appwrite/Platform/Tasks/ScheduleExecutions.php @@ -26,6 +26,7 @@ class ScheduleExecutions extends ScheduleBase $queue = $pools->get('queue')->pop(); $connection = $queue->getResource(); $queueForFunctions = new Func($connection); + $intervalEnd = (new \DateTime())->modify('+' . self::ENQUEUE_TIMER . ' seconds'); foreach ($this->schedules as $schedule) { if (!$schedule['active']) { @@ -38,25 +39,29 @@ class ScheduleExecutions extends ScheduleBase continue; } - $now = new \DateTime(); $scheduledAt = new \DateTime($schedule['schedule']); - - if ($scheduledAt > $now) { + if ($scheduledAt <= $intervalEnd) { continue; } - $queueForFunctions - ->setType('schedule') - // Set functionId instead of function as we don't have $dbForProject - // TODO: Refactor to use function instead of functionId - ->setFunctionId($schedule['resource']['functionId']) - ->setExecution($schedule['resource']) - ->setMethod($schedule['data']['method'] ?? 'POST') - ->setPath($schedule['data']['path'] ?? '/') - ->setHeaders($schedule['data']['headers'] ?? []) - ->setBody($schedule['data']['body'] ?? '') - ->setProject($schedule['project']) - ->trigger(); + $delay = $scheduledAt->getTimestamp() - (new \DateTime())->getTimestamp(); + + \go(function () use ($queueForFunctions, $schedule, $delay) { + \sleep($delay); + + $queueForFunctions + ->setType('schedule') + // Set functionId instead of function as we don't have $dbForProject + // TODO: Refactor to use function instead of functionId + ->setFunctionId($schedule['resource']['functionId']) + ->setExecution($schedule['resource']) + ->setMethod($schedule['data']['method'] ?? 'POST') + ->setPath($schedule['data']['path'] ?? '/') + ->setHeaders($schedule['data']['headers'] ?? []) + ->setBody($schedule['data']['body'] ?? '') + ->setProject($schedule['project']) + ->trigger(); + }); $dbForConsole->deleteDocument( 'schedules',