Fix event_type creationg failure due to race condition

Race condition exists when 2 threads try to create same event_type, so
need detect it and load the event_type again.

Change-Id: If3439817cfbfef90daeb5975338909f8312864c4
Closes-Bug: #1254800
This commit is contained in:
Edwin Zhai 2016-03-08 08:25:15 +00:00
parent 477702ddb1
commit 6f2d7cbc07
1 changed files with 12 additions and 8 deletions

View File

@ -155,14 +155,18 @@ class Connection(base.Connection):
If not, we create it and return the record. This may result in a flush.
"""
if session is None:
session = self._engine_facade.get_session()
with session.begin(subtransactions=True):
et = session.query(models.EventType).filter(
models.EventType.desc == event_type).first()
if not et:
et = models.EventType(event_type)
session.add(et)
try:
if session is None:
session = self._engine_facade.get_session()
with session.begin(subtransactions=True):
et = session.query(models.EventType).filter(
models.EventType.desc == event_type).first()
if not et:
et = models.EventType(event_type)
session.add(et)
except dbexc.DBDuplicateEntry:
et = self._get_or_create_event_type(event_type, session)
return et
def record_events(self, event_models):