gh-129441: Fix some flakiness in test_instrumentation (gh-141881)

Most of the `self.assertTrue(self.called)` checks are flaky because
the worker threads may sometimes finish before the main thread calls
`self.during_threads()`.
This commit is contained in:
Sam Gross 2025-11-24 11:19:07 -05:00 committed by GitHub
parent c490ffb7ac
commit 71126ab19c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -35,10 +35,10 @@ def work(self, n, funcs):
return n return n
return self.work(n - 1, funcs) + self.work(n - 2, funcs) return self.work(n - 1, funcs) + self.work(n - 2, funcs)
def start_work(self, n, funcs): def start_work(self, n, funcs, barrier):
# With the GIL builds we need to make sure that the hooks have # With the GIL builds we need to make sure that the hooks have
# a chance to run as it's possible to run w/o releasing the GIL. # a chance to run as it's possible to run w/o releasing the GIL.
time.sleep(0.1) barrier.wait()
self.work(n, funcs) self.work(n, funcs)
def after_test(self): def after_test(self):
@ -53,14 +53,16 @@ def test_instrumentation(self):
exec("def f(): pass", x) exec("def f(): pass", x)
funcs.append(x["f"]) funcs.append(x["f"])
barrier = Barrier(self.thread_count + 1)
threads = [] threads = []
for i in range(self.thread_count): for i in range(self.thread_count):
# Each thread gets a copy of the func list to avoid contention # Each thread gets a copy of the func list to avoid contention
t = Thread(target=self.start_work, args=(self.fib, list(funcs))) t = Thread(target=self.start_work, args=(self.fib, list(funcs), barrier))
t.start() t.start()
threads.append(t) threads.append(t)
self.after_threads() self.after_threads()
barrier.wait()
while True: while True:
any_alive = False any_alive = False
@ -120,7 +122,6 @@ class MonitoringMultiThreaded(
def setUp(self): def setUp(self):
super().setUp() super().setUp()
self.set = False self.set = False
self.called = False
monitoring.register_callback( monitoring.register_callback(
self.tool_id, monitoring.events.LINE, self.callback self.tool_id, monitoring.events.LINE, self.callback
) )
@ -130,10 +131,7 @@ def tearDown(self):
super().tearDown() super().tearDown()
def callback(self, *args): def callback(self, *args):
self.called = True pass
def after_test(self):
self.assertTrue(self.called)
def during_threads(self): def during_threads(self):
if self.set: if self.set:
@ -151,16 +149,11 @@ class SetTraceMultiThreaded(InstrumentationMultiThreadedMixin, TestCase):
def setUp(self): def setUp(self):
self.set = False self.set = False
self.called = False
def after_test(self):
self.assertTrue(self.called)
def tearDown(self): def tearDown(self):
sys.settrace(None) sys.settrace(None)
def trace_func(self, frame, event, arg): def trace_func(self, frame, event, arg):
self.called = True
return self.trace_func return self.trace_func
def during_threads(self): def during_threads(self):
@ -177,16 +170,11 @@ class SetProfileMultiThreaded(InstrumentationMultiThreadedMixin, TestCase):
def setUp(self): def setUp(self):
self.set = False self.set = False
self.called = False
def after_test(self):
self.assertTrue(self.called)
def tearDown(self): def tearDown(self):
sys.setprofile(None) sys.setprofile(None)
def trace_func(self, frame, event, arg): def trace_func(self, frame, event, arg):
self.called = True
return self.trace_func return self.trace_func
def during_threads(self): def during_threads(self):
@ -203,16 +191,11 @@ class SetProfileAllThreadsMultiThreaded(InstrumentationMultiThreadedMixin, TestC
def setUp(self): def setUp(self):
self.set = False self.set = False
self.called = False
def after_test(self):
self.assertTrue(self.called)
def tearDown(self): def tearDown(self):
threading.setprofile_all_threads(None) threading.setprofile_all_threads(None)
def trace_func(self, frame, event, arg): def trace_func(self, frame, event, arg):
self.called = True
return self.trace_func return self.trace_func
def during_threads(self): def during_threads(self):