From 69d0986e8f29e4dcc7fe22ed1b5dd407566eec06 Mon Sep 17 00:00:00 2001 From: Eric Harney Date: Thu, 21 Mar 2019 13:02:26 -0400 Subject: [PATCH] Fix service_uuid migration for volumes with no host For volumes that have no host assigned, this migration will fail. Skip those volumes, as they don't need to be updated. Closes-Bug: #1821207 Change-Id: I08487575e52c5cfd5a268a23d97b6bd931aeaa45 (cherry picked from commit 47d2a98fa63fb1bdf122c8a40bd06ea9c1709855) (cherry picked from commit 997af3aa6b55d24c55c7cb9d179ca63819e40157) (cherry picked from commit d70fc16718bce37404dd62aba24e2f0b7782a7cc) --- cinder/db/sqlalchemy/api.py | 3 ++- cinder/tests/unit/test_db_api.py | 8 ++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/cinder/db/sqlalchemy/api.py b/cinder/db/sqlalchemy/api.py index 69fe9f7b174..cc502d9e88f 100644 --- a/cinder/db/sqlalchemy/api.py +++ b/cinder/db/sqlalchemy/api.py @@ -621,7 +621,8 @@ def volume_service_uuids_online_data_migration(context, max_count): updated = 0 query = model_query(context, - models.Volume).filter_by(service_uuid=None) + models.Volume).filter_by(service_uuid=None).\ + filter(models.Volume.host.isnot(None)) total = query.count() vol_refs = query.limit(max_count).all() diff --git a/cinder/tests/unit/test_db_api.py b/cinder/tests/unit/test_db_api.py index 450e638ff53..6731c9da369 100644 --- a/cinder/tests/unit/test_db_api.py +++ b/cinder/tests/unit/test_db_api.py @@ -494,6 +494,8 @@ class DBAPIServiceTestCase(BaseTest): self.ctxt, {'host': 'host1@lvm-driver1#lvm-driver1'}) db.volume_create( self.ctxt, {'host': 'host1@lvm-driver1#lvm-driver1'}) + # Entries with no host should be skipped + db.volume_create(self.ctxt, {'host': None}) values = { 'host': 'host1@lvm-driver1', @@ -506,12 +508,14 @@ class DBAPIServiceTestCase(BaseTest): total, updated = db.volume_service_uuids_online_data_migration( self.ctxt, 2) + # total = number of volumes that have hosts and don't have a + # service_uuid self.assertEqual(3, total) self.assertEqual(2, updated) - # Now get the ,last one (intentionally setting max > expected) + # Now get the last one (intentionally setting max > expected) total, updated = db.volume_service_uuids_online_data_migration( - self.ctxt, 2) + self.ctxt, 99) self.assertEqual(1, total) self.assertEqual(1, updated)