Merge "db: Remove explicit autocommit"

This commit is contained in:
Zuul 2023-09-21 22:35:10 +00:00 committed by Gerrit Code Review
commit 88bb1568fc
6 changed files with 593 additions and 456 deletions

File diff suppressed because it is too large Load Diff

View File

@ -279,25 +279,24 @@ def delete_cascade(context, name, session):
"""Raise if not found, has references or not visible"""
namespace_rec = _get_by_name(context, name, session)
with session.begin():
try:
metadef_api.tag.delete_namespace_content(
context, namespace_rec.id, session)
metadef_api.object.delete_namespace_content(
context, namespace_rec.id, session)
metadef_api.property.delete_namespace_content(
context, namespace_rec.id, session)
metadef_api.resource_type_association.delete_namespace_content(
context, namespace_rec.id, session)
session.delete(namespace_rec)
session.flush()
except db_exc.DBError as e:
if isinstance(e.inner_exception, sa_exc.IntegrityError):
LOG.debug("Metadata definition namespace=%s not deleted. "
"Other records still refer to it.", name)
raise exc.MetadefIntegrityError(
record_type='namespace', record_name=name)
else:
raise
try:
metadef_api.tag.delete_namespace_content(
context, namespace_rec.id, session)
metadef_api.object.delete_namespace_content(
context, namespace_rec.id, session)
metadef_api.property.delete_namespace_content(
context, namespace_rec.id, session)
metadef_api.resource_type_association.delete_namespace_content(
context, namespace_rec.id, session)
session.delete(namespace_rec)
session.flush()
except db_exc.DBError as e:
if isinstance(e.inner_exception, sa_exc.IntegrityError):
LOG.debug("Metadata definition namespace=%s not deleted. "
"Other records still refer to it.", name)
raise exc.MetadefIntegrityError(
record_type='namespace', record_name=name)
else:
raise
return namespace_rec.to_dict()

View File

@ -118,19 +118,18 @@ def create_tags(context, namespace_name, tag_list, can_append, session):
namespace = namespace_api.get(context, namespace_name, session)
try:
with session.begin():
if not can_append:
query = (session.query(models.MetadefTag).filter_by(
namespace_id=namespace['id']))
query.delete(synchronize_session='fetch')
for value in tag_list:
value.update({'namespace_id': namespace['id']})
metadef_utils.drop_protected_attrs(
models.MetadefTag, value)
metadef_tag = models.MetadefTag()
metadef_tag.update(value.copy())
metadef_tag.save(session=session)
metadef_tags_list.append(metadef_tag.to_dict())
if not can_append:
query = (session.query(models.MetadefTag).filter_by(
namespace_id=namespace['id']))
query.delete(synchronize_session='fetch')
for value in tag_list:
value.update({'namespace_id': namespace['id']})
metadef_utils.drop_protected_attrs(
models.MetadefTag, value)
metadef_tag = models.MetadefTag()
metadef_tag.update(value.copy())
metadef_tag.save(session=session)
metadef_tags_list.append(metadef_tag.to_dict())
except db_exc.DBDuplicateEntry:
LOG.debug("A metadata tag name=%(name)s"
" in namespace=%(namespace_name)s already exists.",

View File

@ -2160,7 +2160,8 @@ class DBPurgeTests(test_utils.BaseTestCase):
# Verify that no records from images have been deleted
# due to DBReferenceError being raised
images_rows = session.query(images).count()
with session.begin():
images_rows = session.query(images).count()
self.assertEqual(4, images_rows)
def test_purge_task_info_with_refs_to_soft_deleted_tasks(self):
@ -2172,7 +2173,8 @@ class DBPurgeTests(test_utils.BaseTestCase):
self.assertEqual(3, len(tasks))
task_info = sqlalchemyutils.get_table(engine, 'task_info')
task_info_rows = session.query(task_info).count()
with session.begin():
task_info_rows = session.query(task_info).count()
self.assertEqual(3, task_info_rows)
# purge soft deleted rows older than yesterday
@ -2183,7 +2185,8 @@ class DBPurgeTests(test_utils.BaseTestCase):
self.assertEqual(2, len(tasks))
# and no task_info was left behind, 1 row purged
task_info_rows = session.query(task_info).count()
with session.begin():
task_info_rows = session.query(task_info).count()
self.assertEqual(2, task_info_rows)

View File

@ -58,7 +58,7 @@ class TestSqlAlchemyDriver(base.TestDriver,
def test_get_image_with_invalid_long_image_id(self):
image_id = '343f9ba5-0197-41be-9543-16bbb32e12aa-xxxxxx'
self.assertRaises(exception.NotFound, self.db_api._image_get,
self.assertRaises(exception.NotFound, self.db_api.image_get,
self.context, image_id)
def test_image_tag_delete_with_invalid_long_image_id(self):

View File

@ -956,7 +956,7 @@ class RetryOnDeadlockTestCase(test_utils.BaseTestCase):
sess.side_effect = _mock_get_session()
try:
api._image_update(None, {}, 'fake-id')
api.image_update(None, 'fake-id', {})
except TestException:
self.assertEqual(3, sess.call_count)
@ -973,17 +973,19 @@ class RetryOnDeadlockTestCase(test_utils.BaseTestCase):
class TestImageDeleteRace(test_utils.BaseTestCase):
@mock.patch.object(api, 'get_session')
@mock.patch.object(api, 'LOG')
def test_image_property_delete_stale_data(self, mock_LOG):
def test_image_property_delete_stale_data(
self, mock_LOG, mock_get_session,
):
mock_context = mock.MagicMock()
mock_session = mock.MagicMock()
mock_session = mock_get_session.return_value
mock_result = (mock_session.query.return_value.
filter_by.return_value.
one.return_value)
mock_result.delete.side_effect = sa_orm.exc.StaleDataError('myerror')
# StaleDataError should not be raised
r = api.image_property_delete(mock_context, 'myprop', 'myimage',
session=mock_session)
r = api.image_property_delete(mock_context, 'myprop', 'myimage')
# We should not get the property back
self.assertIsNone(r)
# Make sure we logged it
@ -993,9 +995,10 @@ class TestImageDeleteRace(test_utils.BaseTestCase):
'%(err)s', {'prop': 'myprop', 'image': 'myimage',
'err': 'myerror'})
def test_image_property_delete_exception(self):
@mock.patch.object(api, 'get_session')
def test_image_property_delete_exception(self, mock_get_session):
mock_context = mock.MagicMock()
mock_session = mock.MagicMock()
mock_session = mock_get_session.return_value
mock_result = (mock_session.query.return_value.
filter_by.return_value.
one.return_value)
@ -1003,5 +1006,4 @@ class TestImageDeleteRace(test_utils.BaseTestCase):
# Any other exception should be raised
self.assertRaises(RuntimeError,
api.image_property_delete,
mock_context, 'myprop', 'myimage',
session=mock_session)
mock_context, 'myprop', 'myimage')