From 3645839d162a989da46ba1c0fcbe7f32b48b9fb1 Mon Sep 17 00:00:00 2001 From: Arnaud Morin Date: Fri, 3 Mar 2023 11:16:56 +0100 Subject: [PATCH] Disable greenthreads for RabbitDriver "listen" connections When enabling heartbeat_in_pthread, we were restoring the "threading" python library from eventlet to original one in RabbitDriver but we forgot to do the same in AMQPDriverBase (RabbitDriver is subclass of AMQPDriverBase). We also need to use the original "queue" so that queues are not going to use greenthreads as well. Related-bug: #1961402 Related-bug: #1934937 Closes-bug: #2009138 Signed-off-by: Arnaud Morin Change-Id: I34ea0d1381e934297df2f793e0d2594ef8254f00 (cherry picked from commit fd2381c723fe805b17aca1f80bfff4738fbe9628) --- oslo_messaging/_drivers/impl_rabbit.py | 2 ++ oslo_messaging/_utils.py | 3 +++ 2 files changed, 5 insertions(+) diff --git a/oslo_messaging/_drivers/impl_rabbit.py b/oslo_messaging/_drivers/impl_rabbit.py index c61393cc8..1c3268604 100644 --- a/oslo_messaging/_drivers/impl_rabbit.py +++ b/oslo_messaging/_drivers/impl_rabbit.py @@ -649,6 +649,8 @@ class Connection(object): # if it was already monkey patched by eventlet/greenlet. global threading threading = _utils.stdlib_threading + amqpdriver.threading = _utils.stdlib_threading + amqpdriver.queue = _utils.stdlib_queue self.direct_mandatory_flag = driver_conf.direct_mandatory_flag diff --git a/oslo_messaging/_utils.py b/oslo_messaging/_utils.py index 0ce1a1678..ff7440a0a 100644 --- a/oslo_messaging/_utils.py +++ b/oslo_messaging/_utils.py @@ -14,6 +14,7 @@ # under the License. import logging +import queue import threading from oslo_utils import eventletutils @@ -26,12 +27,14 @@ if eventlet and eventletutils.is_monkey_patched("thread"): # Here we initialize module with the native python threading module # if it was already monkey patched by eventlet/greenlet. stdlib_threading = eventlet.patcher.original('threading') + stdlib_queue = eventlet.patcher.original('queue') else: # Manage the case where we run this driver in a non patched environment # and where user even so configure the driver to run heartbeat through # a python thread, if we don't do that when the heartbeat will start # we will facing an issue by trying to override the threading module. stdlib_threading = threading + stdlib_queue = queue def version_is_compatible(imp_version, version):