First, this is most probably not an issue if using WSGI for neutron API
For "standard" setups, parts of neutron-server startup are:
server/wsgi_eventlet.py: start wsgi/api, then start all workers
For wsgi, eventlet_wsgi_server() will eventually result in wsgi.Server.start() call. For multiple workers it will call oslo.service ProcessLauncher (stored in self._server)
For other workers, service.start_all_workers() which in _start_workers() will create a worker launcher (if we have process_workers), which is another call to oslo.service ProcessLauncher
So what happens is RPC processes signals end up on the wsgi ProcessLauncher, which as shown in previous comment, does not know them. It also shows RPC processes are handled correctly with api_workers=0 (where there is only one ProcessLauncher).
Planned fix will be to reuse the neutron API ProcessLauncher instance if it is set
Finally found the root cause here!
First, this is most probably not an issue if using WSGI for neutron API
For "standard" setups, parts of neutron-server startup are: wsgi_eventlet. py: start wsgi/api, then start all workers wsgi_server( ) will eventually result in wsgi.Server.start() call. For multiple workers it will call oslo.service ProcessLauncher (stored in self._server)
server/
For wsgi, eventlet_
For other workers, service. start_all_ workers( ) which in _start_workers() will create a worker launcher (if we have process_workers), which is another call to oslo.service ProcessLauncher
oslo.service https:/ /docs.openstack .org/oslo. service/ latest/ user/usage. html#launchers strongly recommends not to use multiple instances of ProcessLauncher in the same process (probably because at creation it does a few global actions, especially on signal handlers).
So what happens is RPC processes signals end up on the wsgi ProcessLauncher, which as shown in previous comment, does not know them. It also shows RPC processes are handled correctly with api_workers=0 (where there is only one ProcessLauncher).
Planned fix will be to reuse the neutron API ProcessLauncher instance if it is set