diff --git a/manila/manager.py b/manila/manager.py index d9cc5fef1c..9b7217e886 100644 --- a/manila/manager.py +++ b/manila/manager.py @@ -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 diff --git a/manila/scheduler/manager.py b/manila/scheduler/manager.py index 3a5957e5a2..d60ba00aa2 100644 --- a/manila/scheduler/manager.py +++ b/manila/scheduler/manager.py @@ -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) diff --git a/manila/service.py b/manila/service.py index 9e4c16f4fa..8818864724 100644 --- a/manila/service.py +++ b/manila/service.py @@ -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, diff --git a/manila/tests/scheduler/test_manager.py b/manila/tests/scheduler/test_manager.py index 38919a4682..4d3b246e74 100644 --- a/manila/tests/scheduler/test_manager.py +++ b/manila/tests/scheduler/test_manager.py @@ -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') diff --git a/releasenotes/notes/bug-1271568-fix-rpc-init-host-with-rpc-6e76afa553b4f2af.yaml b/releasenotes/notes/bug-1271568-fix-rpc-init-host-with-rpc-6e76afa553b4f2af.yaml new file mode 100644 index 0000000000..d83830731b --- /dev/null +++ b/releasenotes/notes/bug-1271568-fix-rpc-init-host-with-rpc-6e76afa553b4f2af.yaml @@ -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 + `_ for more details.