]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-109917: Fix test instability in test_concurrent_futures (#110306)
authorelfstrom <elfstrom@users.noreply.github.com>
Tue, 3 Oct 2023 21:59:49 +0000 (23:59 +0200)
committerGitHub <noreply@github.com>
Tue, 3 Oct 2023 21:59:49 +0000 (22:59 +0100)
The test had an instability issue due to the ordering of the dummy
queue operation and the real wakeup pipe operations. Both primitives
are thread safe but not done atomically as a single update and may
interleave arbitrarily. With the old order of operations this can lead
to an incorrect state where the dummy queue is full but the wakeup
pipe is empty. By swapping the order in clear() I think this can no
longer happen in any possible operation interleaving (famous last
words).

Lib/test/test_concurrent_futures/test_deadlock.py

index af702542081ad9193e79e011a93372604e0e4557..3c30c4558c0b3e56ca599a2088145835b0a33ed7 100644 (file)
@@ -286,11 +286,12 @@ class ExecutorDeadlockTest:
                 super().wakeup()
 
             def clear(self):
+                super().clear()
                 try:
                     while True:
                         self._dummy_queue.get_nowait()
                 except queue.Empty:
-                    super().clear()
+                    pass
 
         with (unittest.mock.patch.object(futures.process._ExecutorManagerThread,
                                          'run', mock_run),