Merge "sqlalchemy: retry on deadlock for create_resource_type()"
This commit is contained in:
commit
2712e286f6
@ -254,6 +254,20 @@ class SQLAlchemyIndexer(indexer.IndexerDriver):
|
|||||||
self._RESOURCE_TYPE_MANAGER.map_and_create_tables(
|
self._RESOURCE_TYPE_MANAGER.map_and_create_tables(
|
||||||
rt, connection)
|
rt, connection)
|
||||||
|
|
||||||
|
# NOTE(jd) We can have deadlock errors either here or later in
|
||||||
|
# map_and_create_tables(). We can't decorate create_resource_type()
|
||||||
|
# directly or each part might retry later on its own and cause a
|
||||||
|
# duplicate. And it seems there's no way to use the same session for
|
||||||
|
# both adding the resource_type in our table and calling
|
||||||
|
# map_and_create_tables() :-(
|
||||||
|
@retry_on_deadlock
|
||||||
|
def _add_resource_type(self, resource_type):
|
||||||
|
try:
|
||||||
|
with self.facade.writer() as session:
|
||||||
|
session.add(resource_type)
|
||||||
|
except exception.DBDuplicateEntry:
|
||||||
|
raise indexer.ResourceTypeAlreadyExists(resource_type.name)
|
||||||
|
|
||||||
def create_resource_type(self, resource_type):
|
def create_resource_type(self, resource_type):
|
||||||
# NOTE(sileht): mysql have a stupid and small length limitation on the
|
# NOTE(sileht): mysql have a stupid and small length limitation on the
|
||||||
# foreign key and index name, so we can't use the resource type name as
|
# foreign key and index name, so we can't use the resource type name as
|
||||||
@ -269,11 +283,7 @@ class SQLAlchemyIndexer(indexer.IndexerDriver):
|
|||||||
# resource_type
|
# resource_type
|
||||||
resource_type.to_baseclass()
|
resource_type.to_baseclass()
|
||||||
|
|
||||||
try:
|
self._add_resource_type(resource_type)
|
||||||
with self.facade.writer() as session:
|
|
||||||
session.add(resource_type)
|
|
||||||
except exception.DBDuplicateEntry:
|
|
||||||
raise indexer.ResourceTypeAlreadyExists(resource_type.name)
|
|
||||||
|
|
||||||
with self.facade.writer_connection() as connection:
|
with self.facade.writer_connection() as connection:
|
||||||
self._RESOURCE_TYPE_MANAGER.map_and_create_tables(resource_type,
|
self._RESOURCE_TYPE_MANAGER.map_and_create_tables(resource_type,
|
||||||
|
Loading…
Reference in New Issue
Block a user