From dcd69eba14ed57b32c2f1b759cd8289772f364ac Mon Sep 17 00:00:00 2001 From: Ondrej Mirtes Date: Fri, 11 Oct 2024 09:36:06 +0200 Subject: [PATCH] Try to quit the child process only after internal errors were accounted for --- .github/workflows/e2e-tests.yml | 7 ++++ e2e/bug-11826/.gitignore | 2 ++ e2e/bug-11826/composer.json | 8 +++++ e2e/bug-11826/phpstan.neon.dist | 8 +++++ e2e/bug-11826/rules/DummyRule.php | 35 +++++++++++++++++++ .../src/FatalErrorWhenAutoloaded.php | 11 ++++++ src/Parallel/ParallelAnalyser.php | 6 +++- 7 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 e2e/bug-11826/.gitignore create mode 100644 e2e/bug-11826/composer.json create mode 100644 e2e/bug-11826/phpstan.neon.dist create mode 100644 e2e/bug-11826/rules/DummyRule.php create mode 100644 e2e/bug-11826/src/FatalErrorWhenAutoloaded.php diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index c4f626994a..8914cca904 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -248,6 +248,13 @@ jobs: cd e2e/bad-exclude-paths OUTPUT=$(../../bin/phpstan analyse -c ignoreReportUnmatchedFalse.neon) echo "$OUTPUT" + - script: | + cd e2e/bug-11826 + composer install + OUTPUT=$(../bashunit -a exit_code "1" "../../bin/phpstan") + echo "$OUTPUT" + ../bashunit -a contains 'Child process error (exit code 255): PHP Fatal error' "$OUTPUT" + ../bashunit -a contains 'Result is incomplete because of severe errors.' "$OUTPUT" steps: - name: "Checkout" diff --git a/e2e/bug-11826/.gitignore b/e2e/bug-11826/.gitignore new file mode 100644 index 0000000000..de4a392c33 --- /dev/null +++ b/e2e/bug-11826/.gitignore @@ -0,0 +1,2 @@ +/vendor +/composer.lock diff --git a/e2e/bug-11826/composer.json b/e2e/bug-11826/composer.json new file mode 100644 index 0000000000..e33fb45ab0 --- /dev/null +++ b/e2e/bug-11826/composer.json @@ -0,0 +1,8 @@ +{ + "autoload": { + "psr-4": { + "App\\": "src/", + "Rules\\": "rules/" + } + } +} diff --git a/e2e/bug-11826/phpstan.neon.dist b/e2e/bug-11826/phpstan.neon.dist new file mode 100644 index 0000000000..3f491198cf --- /dev/null +++ b/e2e/bug-11826/phpstan.neon.dist @@ -0,0 +1,8 @@ +parameters: + level: 9 + paths: + - src + - rules + +rules: + - Rules\DummyRule diff --git a/e2e/bug-11826/rules/DummyRule.php b/e2e/bug-11826/rules/DummyRule.php new file mode 100644 index 0000000000..0a18225531 --- /dev/null +++ b/e2e/bug-11826/rules/DummyRule.php @@ -0,0 +1,35 @@ + + */ +class DummyRule implements Rule +{ + + public function getNodeType(): string + { + return InClassNode::class; + } + + /** + * @param InClassNode $node + * @return list + */ + public function processNode( + Node $node, + Scope $scope, + ): array + { + return [FatalErrorWhenAutoloaded::AUTOLOAD]; + } + +} diff --git a/e2e/bug-11826/src/FatalErrorWhenAutoloaded.php b/e2e/bug-11826/src/FatalErrorWhenAutoloaded.php new file mode 100644 index 0000000000..a75127a356 --- /dev/null +++ b/e2e/bug-11826/src/FatalErrorWhenAutoloaded.php @@ -0,0 +1,11 @@ +processPool->tryQuitProcess($processIdentifier); if ($exitCode === 0) { + $this->processPool->tryQuitProcess($processIdentifier); return; } if ($exitCode === null) { + $this->processPool->tryQuitProcess($processIdentifier); return; } @@ -294,6 +295,7 @@ public function analyse( continue; } + $this->processPool->tryQuitProcess($processIdentifier); return; } $internalErrors[] = new InternalError(sprintf( @@ -303,11 +305,13 @@ public function analyse( 'Increase your memory limit in php.ini or run PHPStan with --memory-limit CLI option.', ), 'running parallel worker', [], null, false); $internalErrorsCount++; + $this->processPool->tryQuitProcess($processIdentifier); return; } $internalErrors[] = new InternalError(sprintf('Child process error (exit code %d): %s', $exitCode, $output), 'running parallel worker', [], null, true); $internalErrorsCount++; + $this->processPool->tryQuitProcess($processIdentifier); }); $this->processPool->attachProcess($processIdentifier, $process); }