Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[3.11] gh-109974: Fix threading lock_tests race conditions (GH-110057) #110063

Closed

Conversation

miss-islington
Copy link
Contributor

@miss-islington miss-islington commented Sep 29, 2023

Fix race conditions in test_threading lock tests. Wait until a
condition is met rather than using time.sleep() with a hardcoded
number of seconds.

  • Replace sleeping loops with support.sleeping_retry() which raises
    an exception on timeout.
  • Add wait_threads_blocked(nthread) which computes a sleep depending
    on the number of threads. Remove _wait() function.
  • test_set_and_clear(): use a way longer Event.wait() timeout.
  • BarrierTests.test_repr(): wait until the 2 threads are waiting for
    the barrier. Use a way longer timeout for Barrier.wait() timeout.
  • test_thread_leak() no longer needs to count
    len(threading.enumerate()): Bunch uses
    threading_helper.wait_threads_exit() internally which does it in
    wait_for_finished().
  • Add BaseLockTests.wait_phase() which implements a timeout.
    test_reacquire() and test_recursion_count() use wait_phase().
    (cherry picked from commit 4e356ad)

Co-authored-by: Victor Stinner [email protected]

…10057)

Fix race conditions in test_threading lock tests. Wait until a
condition is met rather than using time.sleep() with a hardcoded
number of seconds.

* Replace sleeping loops with support.sleeping_retry() which raises
  an exception on timeout.
* Add wait_threads_blocked(nthread) which computes a sleep depending
  on the number of threads. Remove _wait() function.
* test_set_and_clear(): use a way longer Event.wait() timeout.
* BarrierTests.test_repr(): wait until the 2 threads are waiting for
  the barrier. Use a way longer timeout for Barrier.wait() timeout.
* test_thread_leak() no longer needs to count
  len(threading.enumerate()): Bunch uses
  threading_helper.wait_threads_exit() internally which does it in
  wait_for_finished().
* Add BaseLockTests.wait_phase() which implements a timeout.
  test_reacquire() and test_recursion_count() use wait_phase().
(cherry picked from commit 4e356ad)

Co-authored-by: Victor Stinner <[email protected]>
@vstinner
Copy link
Member

Oh, tests fail with:

AttributeError: module 'test.support' has no attribute 'sleeping_retry'

I will wait until changes are backported to 3.12 to backport these changes properly to 3.11.

@vstinner vstinner closed this Sep 29, 2023
auto-merge was automatically disabled September 29, 2023 12:30

Pull request was closed

@miss-islington miss-islington deleted the backport-4e356ad-3.11 branch September 29, 2023 12:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants