]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-41503: Fix race between setTarget and flush in logging.handlers.MemoryHandler...
authorIrit Katriel <iritkatriel@yahoo.com>
Sun, 16 Aug 2020 15:10:13 +0000 (16:10 +0100)
committerGitHub <noreply@github.com>
Sun, 16 Aug 2020 15:10:13 +0000 (16:10 +0100)
Lib/logging/handlers.py
Lib/test/test_logging.py
Misc/NEWS.d/next/Library/2020-08-07-15-18-16.bpo-41503.IYftcu.rst [new file with mode: 0644]

index 4a120e9f1ec48f2c7236f24d785314da9083f91a..867ef4ebc7600a085ebd5ae7e74159e4fafe4059 100644 (file)
@@ -1324,7 +1324,11 @@ class MemoryHandler(BufferingHandler):
         """
         Set the target handler for this handler.
         """
-        self.target = target
+        self.acquire()
+        try:
+            self.target = target
+        finally:
+            self.release()
 
     def flush(self):
         """
index eb5b926908a192445622024610542c7873c834aa..d8b3727eb11851de220084751d2deb6610d24ba6 100644 (file)
@@ -1160,6 +1160,27 @@ class MemoryHandlerTest(BaseTest):
         # assert that no new lines have been added
         self.assert_log_lines(lines)  # no change
 
+    def test_race_between_set_target_and_flush(self):
+        class MockRaceConditionHandler:
+            def __init__(self, mem_hdlr):
+                self.mem_hdlr = mem_hdlr
+
+            def removeTarget(self):
+                self.mem_hdlr.setTarget(None)
+
+            def handle(self, msg):
+                t = threading.Thread(target=self.removeTarget)
+                t.daemon = True
+                t.start()
+
+        target = MockRaceConditionHandler(self.mem_hdlr)
+        self.mem_hdlr.setTarget(target)
+
+        for _ in range(10):
+            time.sleep(0.005)
+            self.mem_logger.info("not flushed")
+            self.mem_logger.warning("flushed")
+
 
 class ExceptionFormatter(logging.Formatter):
     """A special exception formatter."""
diff --git a/Misc/NEWS.d/next/Library/2020-08-07-15-18-16.bpo-41503.IYftcu.rst b/Misc/NEWS.d/next/Library/2020-08-07-15-18-16.bpo-41503.IYftcu.rst
new file mode 100644 (file)
index 0000000..c34996d
--- /dev/null
@@ -0,0 +1 @@
+Fixed a race between setTarget and flush in logging.handlers.MemoryHandler.
\ No newline at end of file