bpo-41739: Fix test_logging.test_race_between_set_target_and_flush() (GH-22655)

The test now waits until all threads complete to avoid leaking
running threads.

Also, use regular threads rather than daemon threads.
This commit is contained in:
Victor Stinner 2020-10-12 00:37:20 +02:00 committed by GitHub
parent 47ecfd8030
commit 13ff396c01
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 15 additions and 8 deletions

View File

@ -1164,22 +1164,27 @@ class MemoryHandlerTest(BaseTest):
class MockRaceConditionHandler:
def __init__(self, mem_hdlr):
self.mem_hdlr = mem_hdlr
self.threads = []
def removeTarget(self):
self.mem_hdlr.setTarget(None)
def handle(self, msg):
t = threading.Thread(target=self.removeTarget)
t.daemon = True
t.start()
thread = threading.Thread(target=self.removeTarget)
self.threads.append(thread)
thread.start()
target = MockRaceConditionHandler(self.mem_hdlr)
self.mem_hdlr.setTarget(target)
try:
self.mem_hdlr.setTarget(target)
for _ in range(10):
time.sleep(0.005)
self.mem_logger.info("not flushed")
self.mem_logger.warning("flushed")
for _ in range(10):
time.sleep(0.005)
self.mem_logger.info("not flushed")
self.mem_logger.warning("flushed")
finally:
for thread in target.threads:
threading_helper.join_thread(thread)
class ExceptionFormatter(logging.Formatter):

View File

@ -0,0 +1,2 @@
Fix test_logging.test_race_between_set_target_and_flush(): the test now
waits until all threads complete to avoid leaking running threads.