From de82a5dc81816194eecbbf609ca3c179b7aa9368 Mon Sep 17 00:00:00 2001 From: Hongbin Lu Date: Sun, 5 Aug 2018 20:28:57 +0000 Subject: [PATCH] Reuse the RPC transport to create RPC client In before, we created a PRC transport per RPC call. This causes too many RPC connections as reported by the bug. This patch fixes it by initialize the RPC transport at startup and reuse the RPC transport for each API call. Change-Id: I55e409e0b70024673bd25ab460c2a5bfecc717a5 Closes-Bug: #1785371 --- zun/common/config.py | 1 + zun/common/rpc.py | 18 ++++++++++++++++++ zun/common/rpc_service.py | 12 ++++-------- zun/compute/rpcapi.py | 4 ++-- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/zun/common/config.py b/zun/common/config.py index 6cd6b0df6..c98abadfe 100644 --- a/zun/common/config.py +++ b/zun/common/config.py @@ -28,6 +28,7 @@ def parse_args(argv, default_config_files=None): project='zun', version=version.version_info.release_string(), default_config_files=default_config_files) + rpc.init(zun.conf.CONF) def set_config_defaults(): diff --git a/zun/common/rpc.py b/zun/common/rpc.py index 142daea06..26ecb66b4 100644 --- a/zun/common/rpc.py +++ b/zun/common/rpc.py @@ -14,11 +14,13 @@ # under the License. __all__ = [ + 'init', 'set_defaults', 'add_extra_exmods', 'clear_extra_exmods', 'get_allowed_exmods', 'RequestContextSerializer', + 'get_client', ] import oslo_messaging as messaging @@ -30,12 +32,20 @@ from zun.common import exception profiler = importutils.try_import("osprofiler.profiler") +TRANSPORT = None ALLOWED_EXMODS = [ exception.__name__, ] EXTRA_EXMODS = [] +def init(conf): + global TRANSPORT + exmods = get_allowed_exmods() + TRANSPORT = messaging.get_rpc_transport( + conf, allowed_remote_exmods=exmods) + + def set_defaults(control_exchange): messaging.set_transport_defaults(control_exchange) @@ -103,3 +113,11 @@ class ProfilerRequestContextSerializer(RequestContextSerializer): return super(ProfilerRequestContextSerializer, self).deserialize_context(context) + + +def get_client(target, serializer=None, timeout=None): + assert TRANSPORT is not None + return messaging.RPCClient(TRANSPORT, + target, + serializer=serializer, + timeout=timeout) diff --git a/zun/common/rpc_service.py b/zun/common/rpc_service.py index 007058102..7059c2e2b 100644 --- a/zun/common/rpc_service.py +++ b/zun/common/rpc_service.py @@ -84,20 +84,16 @@ class Service(service.Service): class API(object): - def __init__(self, transport=None, context=None, topic=None, server=None, + def __init__(self, context=None, topic=None, server=None, timeout=None): serializer = _init_serializer() - if transport is None: - exmods = rpc.get_allowed_exmods() - transport = messaging.get_rpc_transport( - CONF, allowed_remote_exmods=exmods) self._context = context if topic is None: topic = '' target = messaging.Target(topic=topic, server=server) - self._client = messaging.RPCClient(transport, target, - serializer=serializer, - timeout=timeout) + self._client = rpc.get_client(target, + serializer=serializer, + timeout=timeout) def _call(self, server, method, *args, **kwargs): cctxt = self._client.prepare(server=server) diff --git a/zun/compute/rpcapi.py b/zun/compute/rpcapi.py index d025080e5..9e3fc83f1 100644 --- a/zun/compute/rpcapi.py +++ b/zun/compute/rpcapi.py @@ -47,13 +47,13 @@ class API(rpc_service.API): * 1.1 - Add image endpoints. """ - def __init__(self, transport=None, context=None, topic=None): + def __init__(self, context=None, topic=None): if topic is None: zun.conf.CONF.import_opt( 'topic', 'zun.conf.compute', group='compute') super(API, self).__init__( - transport, context, topic=zun.conf.CONF.compute.topic) + context, topic=zun.conf.CONF.compute.topic) def container_create(self, context, host, container, limits, requested_networks, requested_volumes, run,