Merge "init_host should be called before RPC consumer is created" into stable/ussuri

This commit is contained in:
Zuul 2021-12-09 04:19:00 +00:00 committed by Gerrit Code Review
commit 9fd17c0a6b
5 changed files with 25 additions and 5 deletions

View File

@ -101,7 +101,19 @@ class Manager(base.Base, PeriodicTasks):
def init_host(self):
"""Handle initialization if this is a standalone service.
Child classes should override this method.
A hook point for services to execute tasks before the services are made
available (i.e. showing up on RPC and starting to accept RPC calls) to
other components. Child classes should override this method.
"""
pass
def init_host_with_rpc(self):
"""A hook for service to do jobs after RPC is ready.
Like init_host(), this method is a hook where services get a chance
to execute tasks that *need* RPC. Child classes should override
this method.
"""
pass

View File

@ -83,7 +83,7 @@ class SchedulerManager(manager.Manager):
self.message_api = message_api.API()
super(SchedulerManager, self).__init__(*args, **kwargs)
def init_host(self):
def init_host_with_rpc(self):
ctxt = context.get_admin_context()
self.request_service_capabilities(ctxt)

View File

@ -105,6 +105,7 @@ class Service(service.Service):
LOG.info('Starting %(topic)s node (version %(version_string)s)',
{'topic': self.topic, 'version_string': version_string})
self.model_disconnected = False
self.manager.init_host()
ctxt = context.get_admin_context()
if self.coordinator:
@ -126,7 +127,8 @@ class Service(service.Service):
self.rpcserver = rpc.get_server(target, endpoints)
self.rpcserver.start()
self.manager.init_host()
self.manager.init_host_with_rpc()
if self.report_interval:
pulse = loopingcall.FixedIntervalLoopingCall(self.report_state)
pulse.start(interval=self.report_interval,

View File

@ -85,14 +85,14 @@ class SchedulerManagerTestCase(test.TestCase):
self.assertIsInstance(test_manager.driver, filter.FilterScheduler)
def test_init_host(self):
def test_init_host_with_rpc(self):
self.mock_object(context,
'get_admin_context',
mock.Mock(return_value='fake_admin_context'))
self.mock_object(self.manager, 'request_service_capabilities')
self.manager.init_host()
self.manager.init_host_with_rpc()
self.manager.request_service_capabilities.assert_called_once_with(
'fake_admin_context')

View File

@ -0,0 +1,6 @@
---
fixes:
- |
An issue with RPC handling on service restart was addressed by ensuring
proper initialization before creating the RPC consumer. See `bug 1271568
<https://bugs.launchpad.net/manila/+bug/1271568>`_ for more details.