From 311e5cdc5151536ffc7280604e28de5f0fe245b5 Mon Sep 17 00:00:00 2001 From: Peter Korsgaard Date: Sun, 1 Mar 2026 14:45:36 +0100 Subject: [PATCH] support/testing/run-tests: unbreak on Debian testing/unstable Commit 3d2141bcee("support/testing/run-tests: specify multiprocessing method") added a call to multiprocessing.set_start_method('fork') as a workaround for python 3.14, which changed the default start method to forkserver - Which is incompatible with the nose2 setup. multiprocessing.set_start_method() is only supposed to be called a maximum of 1 time per process and throws a RuntimeError if called more than that (even with the same arguments): >>> import multiprocessing >>> multiprocessing.set_start_method('fork') >>> multiprocessing.set_start_method('fork') Traceback (most recent call last): File "", line 1, in multiprocessing.set_start_method('fork') ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^ File "/usr/lib/python3.13/multiprocessing/context.py", line 247, in set_start_method raise RuntimeError('context has already been set') Debian included a similar patch in python3-nose2 0.51.1-2 (currently in testing/unstable) which adds its own call to set_start_method(): https://salsa.debian.org/python-team/packages/nose2/-/blob/debian/0.15.1-2/debian/patches/0004-plugins-mp-set-context-to-fork-for-Python-3.14-mp-AP.patch?ref_type=tags Which comes from: https://github.com/nose-devs/nose2/pull/644 As discussed in the upstream PR, this is not a correct fix is wrong and breaks various use cases. An issue has been opened to get this fixed in the Debian packaging at: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1129350 But until that is done, rework the patch to: - Only override set_start_method() if needed to limit impact - Monkey patch set_start_method() so additional calls are ignored To unbreak run-test on affected Debian systems and add some documentation to make it clear why this is done. [Peter: use allow_none / force optional arguments as pointed out by Julien] Signed-off-by: Peter Korsgaard --- support/testing/run-tests | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/support/testing/run-tests b/support/testing/run-tests index 1c4d2b4a85..2c7ce87c96 100755 --- a/support/testing/run-tests +++ b/support/testing/run-tests @@ -142,5 +142,15 @@ def main(): if __name__ == "__main__": - multiprocessing.set_start_method("fork") + # python 3.14 changed default start method from fork to + # fork-server, which is not compatible with the nose2 setup + if multiprocessing.get_start_method(allow_none=True) != "fork": + multiprocessing.set_start_method("fork", force=True) + # set_start_method throws a RuntimeError if called more than + # once. + # Debian python3-nose2 0.15.1-2 includes a patch adding + # another set_start_method() call, so monkey patch it out to + # get rid of this + multiprocessing.set_start_method = lambda *args: None + sys.exit(main())