diff --git a/manila/manager.py b/manila/manager.py index 3a5e86d475..ccd2898d1f 100644 --- a/manila/manager.py +++ b/manila/manager.py @@ -103,7 +103,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 8dc31dd0e2..55c2bcf700 100644 --- a/manila/scheduler/manager.py +++ b/manila/scheduler/manager.py @@ -86,7 +86,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 2fcf759e62..3f09504604 100644 --- a/manila/service.py +++ b/manila/service.py @@ -135,6 +135,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: @@ -156,7 +157,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 bdf1b3d80f..c0273b9c5f 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.