diff --git a/neutron/server/wsgi_eventlet.py b/neutron/server/wsgi_eventlet.py index afd58bcca69..a2b3a342274 100644 --- a/neutron/server/wsgi_eventlet.py +++ b/neutron/server/wsgi_eventlet.py @@ -27,7 +27,7 @@ def eventlet_wsgi_server(): def start_api_and_rpc_workers(neutron_api): try: - worker_launcher = service.start_all_workers() + worker_launcher = service.start_all_workers(neutron_api) pool = eventlet.GreenPool() api_thread = pool.spawn(neutron_api.wait) diff --git a/neutron/service.py b/neutron/service.py index 06bf4cdc7b2..0a5fafecd9d 100644 --- a/neutron/service.py +++ b/neutron/service.py @@ -243,7 +243,7 @@ class AllServicesNeutronWorker(neutron_worker.NeutronBaseWorker): self._launcher.restart() -def _start_workers(workers): +def _start_workers(workers, neutron_api=None): process_workers = [ plugin_worker for plugin_worker in workers if plugin_worker.worker_process_count > 0 @@ -251,9 +251,14 @@ def _start_workers(workers): try: if process_workers: - worker_launcher = common_service.ProcessLauncher( - cfg.CONF, wait_interval=1.0, restart_method='mutate' - ) + # Get eventual already existing instance from WSGI app + worker_launcher = None + if neutron_api: + worker_launcher = neutron_api.wsgi_app.process_launcher + if worker_launcher is None: + worker_launcher = common_service.ProcessLauncher( + cfg.CONF, wait_interval=1.0, restart_method='mutate' + ) # add extra process worker and spawn there all workers with # worker_process_count == 0 @@ -285,9 +290,9 @@ def _start_workers(workers): 'details.') -def start_all_workers(): +def start_all_workers(neutron_api=None): workers = _get_rpc_workers() + _get_plugins_workers() - launcher = _start_workers(workers) + launcher = _start_workers(workers, neutron_api) registry.publish(resources.PROCESS, events.AFTER_SPAWN, None) return launcher diff --git a/neutron/wsgi.py b/neutron/wsgi.py index 8552b352c67..fd422835920 100644 --- a/neutron/wsgi.py +++ b/neutron/wsgi.py @@ -226,6 +226,12 @@ class Server(object): log_format=CONF.wsgi_log_format, socket_timeout=self.client_socket_timeout) + @property + def process_launcher(self): + if isinstance(self._server, common_service.ProcessLauncher): + return self._server + return None + class Request(wsgi.Request):