diff --git a/nova/service.py b/nova/service.py index 5cae3b342363..ac027b762e80 100644 --- a/nova/service.py +++ b/nova/service.py @@ -170,7 +170,8 @@ class Service(service.Service): except exception.NotFound: try: self.service_ref = self._create_service_ref(ctxt) - except exception.ServiceTopicExists: + except (exception.ServiceTopicExists, + exception.ServiceBinaryExists): # NOTE(danms): If we race to create a record with a sibling # worker, don't fail here. self.service_ref = self.conductor_api.service_get_by_args(ctxt, diff --git a/nova/tests/test_service.py b/nova/tests/test_service.py index f0725e6b55e2..84826c563e34 100644 --- a/nova/tests/test_service.py +++ b/nova/tests/test_service.py @@ -186,7 +186,7 @@ class ServiceTestCase(test.TestCase): 'nova.tests.test_service.FakeManager') serv.start() - def test_service_check_create_race(self): + def _test_service_check_create_race(self, ex): self.manager_mock = self.mox.CreateMock(FakeManager) self.mox.StubOutWithMock(sys.modules[__name__], 'FakeManager', use_mock_anything=True) @@ -201,7 +201,6 @@ class ServiceTestCase(test.TestCase): db.service_get_by_args(mox.IgnoreArg(), self.host, self.binary ).AndRaise(exception.NotFound) - ex = exception.ServiceTopicExists(host='foo', topic='bar') db.service_create(mox.IgnoreArg(), mox.IgnoreArg() ).AndRaise(ex) @@ -219,6 +218,14 @@ class ServiceTestCase(test.TestCase): 'nova.tests.test_service.FakeManager') self.assertRaises(TestException, serv.start) + def test_service_check_create_race_topic_exists(self): + ex = exception.ServiceTopicExists(host='foo', topic='bar') + self._test_service_check_create_race(ex) + + def test_service_check_create_race_binary_exists(self): + ex = exception.ServiceBinaryExists(host='foo', binary='bar') + self._test_service_check_create_race(ex) + def test_parent_graceful_shutdown(self): self.manager_mock = self.mox.CreateMock(FakeManager) self.mox.StubOutWithMock(sys.modules[__name__],