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:
parent
b38d669d7a
commit
db0cea7121
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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