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
(cherry picked from commit de82a5dc81)
This commit is contained in:
Hongbin Lu 2018-08-05 20:28:57 +00:00
parent b38d669d7a
commit db0cea7121
4 changed files with 25 additions and 10 deletions

View File

@ -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():

View File

@ -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)

View File

@ -87,20 +87,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)

View File

@ -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,