diff --git a/cinder/service.py b/cinder/service.py index 1d2144423fb..439d768e0b4 100644 --- a/cinder/service.py +++ b/cinder/service.py @@ -191,6 +191,7 @@ class Service(service.Service): service_ref.cluster_name = cluster service_ref.save() Service.service_id = service_ref.id + self.origin_service_id = service_ref.id except exception.NotFound: self._create_service_ref(ctxt, manager_class.RPC_API_VERSION) # Service entry Entry didn't exist because it was manually removed @@ -218,6 +219,12 @@ class Service(service.Service): if self.coordination: coordination.COORDINATOR.start() + # NOTE(yikun): When re-spawning child process, we should set the class + # attribute back using the origin service_id, otherwise, + # the Service.service_id will be inherited from the parent process, + # and will be recorded as the last started service id by mistaken. + Service.service_id = self.origin_service_id + self.manager.init_host(added_to_cluster=self.added_to_cluster, service_id=Service.service_id) @@ -342,6 +349,7 @@ class Service(service.Service): service_ref = objects.Service(context=context, **kwargs) service_ref.create() Service.service_id = service_ref.id + self.origin_service_id = service_ref.id self._ensure_cluster_exists(context, service_ref) # If we have updated the service_ref with replication data from # the cluster it will be saved. diff --git a/cinder/tests/unit/test_service.py b/cinder/tests/unit/test_service.py index c964718b054..9a69c4b95ec 100644 --- a/cinder/tests/unit/test_service.py +++ b/cinder/tests/unit/test_service.py @@ -99,6 +99,24 @@ class ServiceManagerTestCase(test.TestCase): self.assertEqual({}, rpc.LAST_OBJ_VERSIONS) self.assertEqual({}, rpc.LAST_RPC_VERSIONS) + def test_start_refresh_serivce_id(self): + serv = service.Service('test', + 'test', + 'test', + 'cinder.tests.unit.test_service.FakeManager') + # records the original service id + serv_id = serv.service_id + self.assertEqual(serv.origin_service_id, service.Service.service_id) + # update service id to other value + service.Service.service_id = serv_id + 1 + # make sure the class attr service_id have been changed + self.assertNotEqual(serv.origin_service_id, + service.Service.service_id) + # call start method + serv.start() + # After start, the service id is refreshed to original service_id + self.assertEqual(serv_id, service.Service.service_id) + class ServiceFlagsTestCase(test.TestCase): def test_service_enabled_on_create_based_on_flag(self):