From a5c5d8d51a7022adc2115a3f3ea14d6a5d940627 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Mon, 5 Oct 2026 10:27:03 +0200 Subject: [PATCH] Record a dirty exit under --check-exitcode as a test failure instead of raising takeEnvDown already records 'redis process failure' against the test whose server did not exit cleanly, which is enough to fail the run and name the test in the summary. Under --check-exitcode it then also raises, and nothing above takeEnvDown catches that exception: it escapes the env scope guard of run_single_test. The raise predates parallel execution (#147): both it and the recorded failure came with --check-exitcode itself. With parallelism, the exception ends the worker process, so: - the failure is never shipped to the coordinator, and the summary does not name the test, or is not printed at all; - the tests still queued on that worker are not run, so a single dirty exit hides an unknown number of other results; - self.currEnv is left set, since the raise skips its reset. That is the same failure mode #257 removed for an exception raised from tearDown. The run stays failed without the raise, through the recorded failure. A dirty exit under --use-valgrind, which also sets require_clean_exit, already takes that path: it records the failure without raising. --exit-on-failure remains the option for stopping at the first failure. --- RLTest/__main__.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/RLTest/__main__.py b/RLTest/__main__.py index 3367afa..5032c23 100644 --- a/RLTest/__main__.py +++ b/RLTest/__main__.py @@ -633,8 +633,6 @@ def takeEnvDown(self, fullShutDown=False): if self.require_clean_exit and self.currEnv and (not self.currEnv.checkExitCode() or not flush_ok): print(Colors.Bred('\tRedis did not exit cleanly')) self.addFailure(self.currEnv.testName, ['redis process failure']) - if self.args.check_exitcode: - raise Exception('Process exited dirty') self.currEnv = None def printException(self, err):