DBMS: Fix volume deletion with MySQL

When using the DBMS plugin with MySQL with default configuration (hard
DB row deletes) the deletion of a volume fails if the volume has
metadata or admin metadata.

The reason are the foreign key constraints from those 2 tables, because
we are not deleting their rows before deleting the volume row.

This doesn't fail with SQLite, but we leave rows behind.

With this patch we will delete all metadata and admin_metadata belonging
to the volume before we delete the volume row itself.

Closes-Bug: #1868148
Change-Id: I8712045752a7a150a3633451246ed992dee35972
This commit is contained in:
Gorka Eguileor
2020-03-19 14:54:55 +01:00
parent 18f85d8b25
commit cefeef4c7e
3 changed files with 24 additions and 0 deletions

View File

@@ -315,6 +315,10 @@ class DBPersistence(persistence_base.PersistenceDriverBase):
volume.volume_type.qos_specs_id)
else:
LOG.debug('hard deleting volume %s', volume.id)
for model in (models.VolumeMetadata, models.VolumeAdminMetadata):
query = sqla_api.model_query(objects.CONTEXT, model)
query.filter_by(volume_id=volume.id).delete()
query = sqla_api.model_query(objects.CONTEXT, models.Volume)
query.filter_by(id=volume.id).delete()
if delete_type:

View File

@@ -120,6 +120,21 @@ class TestDBPersistence(base.BasePersistenceTest):
cinder_ovos.VolumeType)
self.assertEqual('__DEFAULT__', self.persistence.DEFAULT_TYPE.name)
def test_delete_volume_with_metadata(self):
vols = self.create_volumes([{'size': i, 'name': 'disk%s' % i,
'metadata': {'k': 'v', 'k2': 'v2'},
'admin_metadata': {'k': '1'}}
for i in range(1, 3)])
self.persistence.delete_volume(vols[0])
res = self.persistence.get_volumes()
self.assertListEqualObj([vols[1]], res)
for model in (dbms.models.VolumeMetadata,
dbms.models.VolumeAdminMetadata):
query = dbms.sqla_api.model_query(self.context, model)
res = query.filter_by(volume_id=vols[0].id).all()
self.assertEqual([], res)
class TestMemoryDBPersistence(TestDBPersistence):
PERSISTENCE_CFG = {'storage': 'memory_db'}

View File

@@ -0,0 +1,5 @@
---
fixes:
- |
Bug #1868148: Volume deletion no longer fails due to DB constraints when
using the DBMS metadata persistence plugin with a MySQL backend.