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
This commit is contained in:
parent
b2e8e142e3
commit
de82a5dc81
|
@ -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():
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue