diff --git a/app/executor.php b/app/executor.php index 40c636acb..51215b637 100644 --- a/app/executor.php +++ b/app/executor.php @@ -25,14 +25,14 @@ use Utopia\Swoole\Response; use Utopia\Validator\ArrayList; use Utopia\Validator\Assoc; use Utopia\Validator\Boolean; -use Utopia\Validator\Range as ValidatorRange; +use Utopia\Validator\Range; use Utopia\Validator\Text; Runtime::enableCoroutine(true, SWOOLE_HOOK_ALL); /** Constants */ -const MAINTENANCE_INTERVAL = 1200; // 20 minutes +const MAINTENANCE_INTERVAL = 3600; // 3600 seconds = 1 hour /** * Create a Swoole table to store runtime information @@ -395,9 +395,9 @@ App::delete('/v1/runtimes/:runtimeId') App::post('/v1/execution') ->desc('Create an execution') ->param('runtimeId', '', new Text(64), 'The runtimeID to execute') - ->param('vars', [], new Assoc(), 'Environment variables required for the build', false) - ->param('data', '', new Text(8192), 'Data to be forwarded to the function, this is user specified.', true) - ->param('timeout', 15, new ValidatorRange(1, 900), 'Function maximum execution time in seconds.', true) + ->param('vars', [], new Assoc(), 'Environment variables required for the build') + ->param('data', '{}', new Text(8192), 'Data to be forwarded to the function, this is user specified.', true) + ->param('timeout', 15, new Range(1, (int) App::getEnv('_APP_FUNCTIONS_TIMEOUT', 900)), 'Function maximum execution time in seconds.') ->inject('activeRuntimes') ->inject('response') ->action( @@ -423,17 +423,19 @@ App::post('/v1/execution') $errNo = -1; $executorResponse = ''; + $timeout = $timeout ?? (int) App::getEnv('_APP_FUNCTIONS_TIMEOUT', 900); + $ch = \curl_init(); $body = \json_encode([ 'env' => $vars, 'payload' => $data, - 'timeout' => $timeout ?? (int) App::getEnv('_APP_FUNCTIONS_TIMEOUT', 900) + 'timeout' => $timeout ]); \curl_setopt($ch, CURLOPT_URL, "http://" . $runtimeId . ":3000/"); \curl_setopt($ch, CURLOPT_POST, true); \curl_setopt($ch, CURLOPT_POSTFIELDS, $body); \curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - \curl_setopt($ch, CURLOPT_TIMEOUT, $timeout ?? (int) App::getEnv('_APP_FUNCTIONS_TIMEOUT', 900)); + \curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); \curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); \curl_setopt($ch, CURLOPT_HTTPHEADER, [ diff --git a/src/Executor/Executor.php b/src/Executor/Executor.php index 2bdad22e8..33cd17cce 100644 --- a/src/Executor/Executor.php +++ b/src/Executor/Executor.php @@ -82,7 +82,9 @@ class Executor 'commands' => $commands ]; - $response = $this->call(self::METHOD_POST, $route, $headers, $params, true, App::getEnv('_APP_FUNCTIONS_TIMEOUT', 900)); + $timeout = (int) App::getEnv('_APP_FUNCTIONS_BUILD_TIMEOUT', 900); + + $response = $this->call(self::METHOD_POST, $route, $headers, $params, true, $timeout); $status = $response['headers']['status-code']; if ($status >= 400) { @@ -159,13 +161,18 @@ class Executor 'timeout' => $timeout, ]; - $response = $this->call(self::METHOD_POST, $route, $headers, $params, true, 30); + /* Add 2 seconds as a buffer to the actual timeout value since there can be a slight variance*/ + $requestTimeout = $timeout + 2; + + $response = $this->call(self::METHOD_POST, $route, $headers, $params, true, $requestTimeout); $status = $response['headers']['status-code']; - if ($status >= 400) { - for ($attempts = 0; $attempts < 10; $attempts++) { - switch ($status) { - case 404: + for ($attempts = 0; $attempts < 10; $attempts++) { + try { + switch (true) { + case $status < 400: + return $response['body']; + case $status == 404: $response = $this->createRuntime( deploymentId: $deploymentId, projectId: $projectId, @@ -176,31 +183,23 @@ class Executor entrypoint: $entrypoint, commands: [] ); - $response = $this->call(self::METHOD_POST, $route, $headers, $params, true, 30); + $response = $this->call(self::METHOD_POST, $route, $headers, $params, true, $requestTimeout); $status = $response['headers']['status-code']; break; - case 406: - $response = $this->call(self::METHOD_POST, $route, $headers, $params, true, 30); + case $status == 406: + $response = $this->call(self::METHOD_POST, $route, $headers, $params, true, $requestTimeout); $status = $response['headers']['status-code']; break; default: throw new \Exception($response['body']['message'], $status); } - - if ($status < 400) { - return $response['body']; - } - - if ($status != 406) { - throw new \Exception($response['body']['message'], $status); - } - - sleep(2); + } catch (\Exception $e) { + throw new \Exception($e->getMessage(), $e->getCode()); } - throw new Exception($response['body']['message'], 503); + sleep(2); } - return $response['body']; + throw new Exception($response['body']['message'], 503); } /**