]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-119819: Fix regression to allow logging configuration with multipr… (GH-120030)
authorVinay Sajip <vinay_sajip@yahoo.co.uk>
Tue, 4 Jun 2024 12:20:50 +0000 (13:20 +0100)
committerGitHub <noreply@github.com>
Tue, 4 Jun 2024 12:20:50 +0000 (13:20 +0100)
Lib/logging/config.py
Lib/test/test_logging.py
Misc/NEWS.d/next/Library/2024-06-04-12-23-01.gh-issue-119819.WKKrYh.rst [new file with mode: 0644]

index ac45d6809c805caec6555aeba2450a454e71f696..0b10bf82b60a364bf7c6ede504a564d4bd0deb5f 100644 (file)
@@ -781,8 +781,10 @@ class DictConfigurator(BaseConfigurator):
                     # raise ValueError('No handlers specified for a QueueHandler')
                 if 'queue' in config:
                     from multiprocessing.queues import Queue as MPQueue
+                    from multiprocessing import Manager as MM
+                    proxy_queue = MM().Queue()
                     qspec = config['queue']
-                    if not isinstance(qspec, (queue.Queue, MPQueue)):
+                    if not isinstance(qspec, (queue.Queue, MPQueue, type(proxy_queue))):
                         if isinstance(qspec, str):
                             q = self.resolve(qspec)
                             if not callable(q):
index 9ebd3457a18d682e014d4c3942cef04f074de3ee..d3e5ac2be2e21e5d0d95a7809099c141a1a082fc 100644 (file)
@@ -3926,6 +3926,32 @@ class ConfigDictTest(BaseTest):
             msg = str(ctx.exception)
             self.assertEqual(msg, "Unable to configure handler 'ah'")
 
+    @unittest.skipIf(support.is_wasi, "WASI does not have multiprocessing.")
+    def test_multiprocessing_queues(self):
+        # See gh-119819
+        cd = copy.deepcopy(self.config_queue_handler)
+        from multiprocessing import Queue as MQ, Manager as MM
+        q1 = MQ()  # this can't be pickled
+        q2 = MM().Queue()  # a proxy queue for use when pickling is needed
+        for qspec in (q1, q2):
+            fn = make_temp_file('.log', 'test_logging-cmpqh-')
+            cd['handlers']['h1']['filename'] = fn
+            cd['handlers']['ah']['queue'] = qspec
+            qh = None
+            try:
+                self.apply_config(cd)
+                qh = logging.getHandlerByName('ah')
+                self.assertEqual(sorted(logging.getHandlerNames()), ['ah', 'h1'])
+                self.assertIsNotNone(qh.listener)
+                self.assertIs(qh.queue, qspec)
+                self.assertIs(qh.listener.queue, qspec)
+            finally:
+                h = logging.getHandlerByName('h1')
+                if h:
+                    self.addCleanup(closeFileHandler, h, fn)
+                else:
+                    self.addCleanup(os.remove, fn)
+
     def test_90195(self):
         # See gh-90195
         config = {
diff --git a/Misc/NEWS.d/next/Library/2024-06-04-12-23-01.gh-issue-119819.WKKrYh.rst b/Misc/NEWS.d/next/Library/2024-06-04-12-23-01.gh-issue-119819.WKKrYh.rst
new file mode 100644 (file)
index 0000000..f9e49c0
--- /dev/null
@@ -0,0 +1,2 @@
+Fix regression to allow logging configuration with multiprocessing queue
+types.