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 8e5d89d63c8..4a2ad6ed337 100644 --- a/neutron/service.py +++ b/neutron/service.py @@ -218,7 +218,7 @@ class AllServicesNeutronWorker(neutron_worker.BaseWorker): 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 @@ -226,9 +226,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 @@ -260,9 +265,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 ef04f1965cf..508bca5b8b4 100644 --- a/neutron/wsgi.py +++ b/neutron/wsgi.py @@ -224,6 +224,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):