diff --git a/app/Providers/ConcurrencyServiceProvider.php b/app/Providers/ConcurrencyServiceProvider.php deleted file mode 100644 index 7fe1c83a4..000000000 --- a/app/Providers/ConcurrencyServiceProvider.php +++ /dev/null @@ -1,31 +0,0 @@ -app->afterResolving(ConcurrencyManager::class, function (ConcurrencyManager $manager): void { - $manager->extend('process', function (): TimeoutAwareProcessDriver { - $configuredTimeout = config('nntmux.concurrency_timeout'); - $timeout = (int) ($configuredTimeout ?? config('nntmux.multiprocessing_max_child_time', 1800)); - - return new TimeoutAwareProcessDriver( - app(ProcessFactory::class), - $timeout - ); - }); - }); - } -} diff --git a/app/Services/Concurrency/TimeoutAwareProcessDriver.php b/app/Services/Concurrency/TimeoutAwareProcessDriver.php deleted file mode 100644 index 7b8984248..000000000 --- a/app/Services/Concurrency/TimeoutAwareProcessDriver.php +++ /dev/null @@ -1,72 +0,0 @@ -processFactory->pool(function (Pool $pool) use ($tasks, $command) { - foreach (Arr::wrap($tasks) as $key => $task) { - $pool->as((string) $key) - ->timeout($this->timeout) - ->path(base_path()) - ->env([ - 'LARAVEL_INVOKABLE_CLOSURE' => base64_encode( - serialize(new SerializableClosure($task)) - ), - ]) - ->command($command); - } - })->start()->wait(); - - return $results->collect()->mapWithKeys(function ($result, $key) { - if ($result->failed()) { - throw new Exception('Concurrent process failed with exit code ['.$result->exitCode().']. Message: '.$result->errorOutput()); - } - - $output = $result->output(); - - if (($pos = strpos($output, "\x1f\x8b")) !== false) { - $output = substr($output, 0, $pos); - } - - $decodedResult = json_decode($output, true); - - if (! $decodedResult['successful']) { - throw new $decodedResult['exception']( - ...(! empty(array_filter($decodedResult['parameters'])) - ? $decodedResult['parameters'] - : [$decodedResult['message']]) - ); - } - - return [$key => unserialize($decodedResult['result'])]; - })->all(); - } -} diff --git a/app/Services/Runners/BaseRunner.php b/app/Services/Runners/BaseRunner.php index b89c9f21a..ff52b61dd 100644 --- a/app/Services/Runners/BaseRunner.php +++ b/app/Services/Runners/BaseRunner.php @@ -11,6 +11,16 @@ abstract class BaseRunner { public function __construct() {} + /** + * Resolve the configured timeout (seconds) for Laravel's Concurrency::run() calls. + */ + protected function concurrencyTimeout(): int + { + $configured = config('nntmux.concurrency_timeout'); + + return (int) ($configured ?? config('nntmux.multiprocessing_max_child_time', 1800)); + } + protected function buildDnrCommand(string $args): string { // Convert legacy command arguments to new artisan commands diff --git a/app/Services/Runners/PostProcessRunner.php b/app/Services/Runners/PostProcessRunner.php index 2974c3fb3..d14eaeeda 100644 --- a/app/Services/Runners/PostProcessRunner.php +++ b/app/Services/Runners/PostProcessRunner.php @@ -71,7 +71,7 @@ class PostProcessRunner extends BaseRunner } try { - $results = Concurrency::run($tasks); + $results = Concurrency::run($tasks, $this->concurrencyTimeout()); foreach ($results as $taskIdx => $output) { echo $output; @@ -267,7 +267,7 @@ class PostProcessRunner extends BaseRunner } try { - $results = Concurrency::run($tasks); + $results = Concurrency::run($tasks, $this->concurrencyTimeout()); foreach ($results as $taskIdx => $output) { echo $output; diff --git a/app/Services/Runners/ReleasesRunner.php b/app/Services/Runners/ReleasesRunner.php index 99044d2b9..8395d4c65 100644 --- a/app/Services/Runners/ReleasesRunner.php +++ b/app/Services/Runners/ReleasesRunner.php @@ -62,7 +62,7 @@ class ReleasesRunner extends BaseRunner } try { - $results = Concurrency::run($tasks); + $results = Concurrency::run($tasks, $this->concurrencyTimeout()); foreach ($results as $groupId => $output) { echo $output; @@ -111,7 +111,7 @@ class ReleasesRunner extends BaseRunner } try { - $results = Concurrency::run($tasks); + $results = Concurrency::run($tasks, $this->concurrencyTimeout()); foreach ($results as $groupId => $output) { echo $output; @@ -184,7 +184,7 @@ class ReleasesRunner extends BaseRunner } try { - $results = Concurrency::run($tasks); + $results = Concurrency::run($tasks, $this->concurrencyTimeout()); foreach ($results as $taskIdx => $output) { echo $output; diff --git a/bootstrap/providers.php b/bootstrap/providers.php index 83dd49fad..39a68f6cc 100644 --- a/bootstrap/providers.php +++ b/bootstrap/providers.php @@ -3,7 +3,6 @@ use App\Providers\AdditionalProcessingServiceProvider; use App\Providers\AppServiceProvider; use App\Providers\CategorizationServiceProvider; -use App\Providers\ConcurrencyServiceProvider; use App\Providers\ForumServiceProvider; use App\Providers\HorizonServiceProvider; use App\Providers\ProcessingServiceProvider; @@ -15,7 +14,6 @@ return [ AdditionalProcessingServiceProvider::class, AppServiceProvider::class, CategorizationServiceProvider::class, - ConcurrencyServiceProvider::class, ForumServiceProvider::class, HorizonServiceProvider::class, ProcessingServiceProvider::class, diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 0425efdba..3f64862bd 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -786,17 +786,6 @@ parameters: count: 1 path: app/Services/Categorization/CategorizationService.php - - - message: '#^Method App\\Services\\Concurrency\\TimeoutAwareProcessDriver\:\:run\(\) has parameter \$tasks with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: app/Services/Concurrency/TimeoutAwareProcessDriver.php - - - - message: '#^Method App\\Services\\Concurrency\\TimeoutAwareProcessDriver\:\:run\(\) return type has no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: app/Services/Concurrency/TimeoutAwareProcessDriver.php - message: '#^Strict comparison using \!\=\= between non\-empty\-array\ and array\{\} will always evaluate to true\.$#'