From c776607c4305304f56e779403e1d23ad51e8dcb5 Mon Sep 17 00:00:00 2001 From: Dirk Mueller Date: Thu, 29 Jan 2015 14:11:35 +0100 Subject: [PATCH] RBD: Make snapshot_delete more robust Since there is no equivalent of a force-snapshot-delete, the normal snapshot-delete should be more robust to also handle backend errors. In case the backend does not have the image snapshot anymore, log an info message and succeed the operation. Change-Id: I7fe0878dbc07053ac78272b6998513fafa1c36e8 Closes-Bug: #1415905 Related-Bug: #1361926 --- cinder/tests/unit/test_rbd.py | 13 +++++++++++++ cinder/volume/drivers/rbd.py | 3 +++ 2 files changed, 16 insertions(+) diff --git a/cinder/tests/unit/test_rbd.py b/cinder/tests/unit/test_rbd.py index 0cfc129c0..91eeebe7d 100644 --- a/cinder/tests/unit/test_rbd.py +++ b/cinder/tests/unit/test_rbd.py @@ -371,6 +371,19 @@ class RBDTestCase(test.TestCase): proxy.remove_snap.assert_called_with(self.snapshot_name) proxy.unprotect_snap.assert_called_with(self.snapshot_name) + @common_mocks + def test_delete_notfound_snapshot(self): + proxy = self.mock_proxy.return_value + proxy.__enter__.return_value = proxy + + proxy.unprotect_snap.side_effect = ( + self.mock_rbd.ImageNotFound) + + self.driver.delete_snapshot(self.snapshot) + + proxy.remove_snap.assert_called_with(self.snapshot_name) + proxy.unprotect_snap.assert_called_with(self.snapshot_name) + @common_mocks def test_delete_busy_snapshot(self): proxy = self.mock_proxy.return_value diff --git a/cinder/volume/drivers/rbd.py b/cinder/volume/drivers/rbd.py index c54aecbe2..1de8f3079 100644 --- a/cinder/volume/drivers/rbd.py +++ b/cinder/volume/drivers/rbd.py @@ -749,6 +749,9 @@ class RBDDriver(driver.TransferVD, driver.ExtendVD, with RBDVolumeProxy(self, volume_name) as volume: try: volume.unprotect_snap(snap_name) + except self.rbd.ImageNotFound: + LOG.info(_LI("Snapshot %s does not exist in backend."), + snap_name) except self.rbd.ImageBusy: children_list = self._get_children_info(volume, snap_name) -- 2.45.2