Skip to content

Commit 08f0a21

Browse files
[3.8] bpo-41503: Fix race between setTarget and flush in logging.handlers.MemoryHandler (GH-21765) (GH-21898)
(cherry picked from commit 2353d77) Co-authored-by: Irit Katriel <iritkatriel@yahoo.com> Automerge-Triggered-By: @vsajip
1 parent 2434581 commit 08f0a21

File tree

3 files changed

+27
-1
lines changed

3 files changed

+27
-1
lines changed

Lib/logging/handlers.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1294,7 +1294,11 @@ def setTarget(self, target):
12941294
"""
12951295
Set the target handler for this handler.
12961296
"""
1297-
self.target = target
1297+
self.acquire()
1298+
try:
1299+
self.target = target
1300+
finally:
1301+
self.release()
12981302

12991303
def flush(self):
13001304
"""

Lib/test/test_logging.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1173,6 +1173,27 @@ def test_flush_on_close(self):
11731173
# assert that no new lines have been added
11741174
self.assert_log_lines(lines) # no change
11751175

1176+
def test_race_between_set_target_and_flush(self):
1177+
class MockRaceConditionHandler:
1178+
def __init__(self, mem_hdlr):
1179+
self.mem_hdlr = mem_hdlr
1180+
1181+
def removeTarget(self):
1182+
self.mem_hdlr.setTarget(None)
1183+
1184+
def handle(self, msg):
1185+
t = threading.Thread(target=self.removeTarget)
1186+
t.daemon = True
1187+
t.start()
1188+
1189+
target = MockRaceConditionHandler(self.mem_hdlr)
1190+
self.mem_hdlr.setTarget(target)
1191+
1192+
for _ in range(10):
1193+
time.sleep(0.005)
1194+
self.mem_logger.info("not flushed")
1195+
self.mem_logger.warning("flushed")
1196+
11761197

11771198
class ExceptionFormatter(logging.Formatter):
11781199
"""A special exception formatter."""
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fixed a race between setTarget and flush in logging.handlers.MemoryHandler.

0 commit comments

Comments
 (0)