Deal with db_exc.DBDuplicate of conductor startup

we have enable multiple workers of magnum-conductor that
result in multiple processes save same DB entry concurrently.

This patch logs warning message instead of raising exception

Change-Id: I548d50bed5d80e96042f88039e880075e1bffc53
Close-Bug: #1711324
This commit is contained in:
chestack 2017-08-17 18:05:02 +08:00 committed by Wang Bo
parent f67b7295b7
commit a8fe48685d
2 changed files with 14 additions and 4 deletions

View File

@ -17,6 +17,7 @@
from oslo_db import exception as db_exc
from oslo_db.sqlalchemy import session as db_session
from oslo_db.sqlalchemy import utils as db_utils
from oslo_log import log
from oslo_utils import importutils
from oslo_utils import strutils
from oslo_utils import timeutils
@ -38,6 +39,7 @@ profiler_sqlalchemy = importutils.try_import('osprofiler.sqlalchemy')
CONF = magnum.conf.CONF
LOG = log.getLogger(__name__)
_FACADE = None
@ -533,7 +535,14 @@ class Connection(api.Connection):
try:
magnum_service.save()
except db_exc.DBDuplicateEntry:
raise exception.MagnumServiceAlreadyExists(id=magnum_service['id'])
host = values["host"]
binary = values["binary"]
LOG.warning("Magnum service with same host:%(host)s and"
" binary:%(binary)s had been saved into DB",
{'host': host, 'binary': binary})
query = model_query(models.MagnumService)
query = query.filter_by(host=host, binary=binary)
return query.one()
return magnum_service
def get_magnum_service_list(self, disabled=None, limit=None,

View File

@ -24,9 +24,10 @@ class DbMagnumServiceTestCase(base.DbTestCase):
utils.create_test_magnum_service()
def test_create_magnum_service_failure_for_dup(self):
utils.create_test_magnum_service()
self.assertRaises(exception.MagnumServiceAlreadyExists,
utils.create_test_magnum_service)
ms = utils.create_test_magnum_service()
res = self.dbapi.get_magnum_service_by_host_and_binary(
ms['host'], ms['binary'])
self.assertEqual(ms.id, res.id)
def test_get_magnum_service_by_host_and_binary(self):
ms = utils.create_test_magnum_service()