Re-use existing ProcessLauncher from wsgi in RPC workers
If both are run under the same process, and api_workers >= 2, the server
process will instantiate two oslo_service.ProcessLauncher instances
This should be avoided [0], and indeed causes issues on subprocess and
signal handling: killed RPC workers not respawning, SIGHUP on master
process leading to unresponsive server, signal not properly sent to all
child processes, ...
To avoid this, use the wsgi ProcessLauncher instance if it exists
[0] https://docs.openstack.org/oslo.service/latest/user/usage.html#launchers
Change-Id: Ic821f8ca84add9c8137ef712031afb43e491591c
Closes-Bug: #1780139
(cherry picked from commit 13aa00026f
)
This commit is contained in:
parent
e894904a7d
commit
13f2e1344a
@ -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)
|
||||
|
@ -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
|
||||
|
||||
|
@ -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):
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user