summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Harney <eharney@redhat.com>2022-11-28 09:26:18 -0500
committerEric Harney <eharney@redhat.com>2023-03-07 19:23:00 +0000
commit6e08f15074baa608d238959aa8f3fd6c9838ad7d (patch)
tree71a1b187a5c468faa1ff3d7c285e50927bc28df0
parenta92aa06e463f6322e8abdc2f570a801ea82dd1cb (diff)
downloadcinder-6e08f15074baa608d238959aa8f3fd6c9838ad7d.tar.gz
RBD: Skip update_features when features = 0
librbd errors when update_features is called w/ features = 0 -- when this situation would occur, skip calling update_features. Closes-Bug: #1997980 Change-Id: Iab6a990ce7dee2c13deb4f46aeec0f46ffb7cd62
-rw-r--r--cinder/tests/unit/volume/drivers/test_rbd.py23
-rw-r--r--cinder/volume/drivers/rbd.py6
-rw-r--r--releasenotes/notes/rbd-update-features-bugfix-df97b50864ce9712.yaml6
3 files changed, 33 insertions, 2 deletions
diff --git a/cinder/tests/unit/volume/drivers/test_rbd.py b/cinder/tests/unit/volume/drivers/test_rbd.py
index 21645886f..ae672399a 100644
--- a/cinder/tests/unit/volume/drivers/test_rbd.py
+++ b/cinder/tests/unit/volume/drivers/test_rbd.py
@@ -3316,6 +3316,17 @@ class RBDTestCase(test.TestCase):
{'provider_location':
"{\"saved_features\":%s}" % image_features}, ret)
+ @common_mocks
+ def test_enable_multiattach_no_features(self):
+ image = self.mock_proxy.return_value.__enter__.return_value
+ image.features.return_value = 0
+
+ ret = self.driver._enable_multiattach(self.volume_a)
+
+ image.update_features.assert_not_called()
+
+ self.assertEqual({'provider_location': '{"saved_features":0}'}, ret)
+
@ddt.data(MULTIATTACH_FULL_FEATURES, MULTIATTACH_REDUCED_FEATURES)
@common_mocks
def test_disable_multiattach(self, features):
@@ -3329,6 +3340,18 @@ class RBDTestCase(test.TestCase):
self.assertEqual({'provider_location': None}, ret)
+ @common_mocks
+ def test_disable_multiattach_no_features(self):
+ image = self.mock_proxy.return_value.__enter__.return_value
+ self.volume_a.provider_location = '{"saved_features": 0}'
+ image.features.return_value = 0
+
+ ret = self.driver._disable_multiattach(self.volume_a)
+
+ image.update_features.assert_not_called()
+
+ self.assertEqual({'provider_location': None}, ret)
+
class ManagedRBDTestCase(test_driver.BaseDriverTestCase):
driver_name = "cinder.volume.drivers.rbd.RBDDriver"
diff --git a/cinder/volume/drivers/rbd.py b/cinder/volume/drivers/rbd.py
index 07cc72174..b3c55f977 100644
--- a/cinder/volume/drivers/rbd.py
+++ b/cinder/volume/drivers/rbd.py
@@ -965,7 +965,8 @@ class RBDDriver(driver.CloneableImageVD, driver.MigrateVD,
with RBDVolumeProxy(self, vol_name) as image:
image_features = image.features()
change_features = self.MULTIATTACH_EXCLUSIONS & image_features
- image.update_features(change_features, False)
+ if change_features != 0:
+ image.update_features(change_features, False)
return {'provider_location':
self._dumps({'saved_features': image_features})}
@@ -977,7 +978,8 @@ class RBDDriver(driver.CloneableImageVD, driver.MigrateVD,
provider_location = json.loads(volume.provider_location)
image_features = provider_location['saved_features']
change_features = self.MULTIATTACH_EXCLUSIONS & image_features
- image.update_features(change_features, True)
+ if change_features != 0:
+ image.update_features(change_features, True)
except IndexError:
msg = "Could not find saved image features."
raise RBDDriverException(reason=msg)
diff --git a/releasenotes/notes/rbd-update-features-bugfix-df97b50864ce9712.yaml b/releasenotes/notes/rbd-update-features-bugfix-df97b50864ce9712.yaml
new file mode 100644
index 000000000..fa066bd17
--- /dev/null
+++ b/releasenotes/notes/rbd-update-features-bugfix-df97b50864ce9712.yaml
@@ -0,0 +1,6 @@
+---
+fixes:
+ - |
+ `Bug #1997980 <https://bugs.launchpad.net/cinder/+bug/1997980>`_: RBD:
+ Fixed failure to update rbd image features for multi-attach when
+ features = 0.