Merge "RBD: fix volume reference handling in clone logic" into stable/train

This commit is contained in:
Zuul 2020-03-27 21:25:40 +00:00 committed by Gerrit Code Review
commit e79b98367b
2 changed files with 8 additions and 6 deletions

View File

@ -1070,10 +1070,13 @@ class RBDTestCase(test.TestCase):
(self.mock_rbd.Image.return_value.protect_snap
.assert_called_once_with('.'.join(
(self.volume_b.name, 'clone_snap'))))
# We expect clone() to be called exactly once.
self.assertEqual(
1, self.mock_rbd.RBD.return_value.clone.call_count)
# Without flattening, only the source volume is opened,
# so only one call to close() should occur.
self.assertEqual(
2, self.mock_rbd.Image.return_value.close.call_count)
1, self.mock_rbd.Image.return_value.close.call_count)
self.assertTrue(mock_get_clone_depth.called)
mock_resize.assert_not_called()
mock_enable_repl.assert_not_called()
@ -1109,7 +1112,7 @@ class RBDTestCase(test.TestCase):
image.protect_snap.assert_called_once_with(name + '.clone_snap')
self.assertEqual(1, self.mock_rbd.RBD.return_value.clone.call_count)
self.assertEqual(
2, self.mock_rbd.Image.return_value.close.call_count)
1, self.mock_rbd.Image.return_value.close.call_count)
mock_get_clone_depth.assert_called_once_with(
self.mock_client().__enter__(), self.volume_a.name)
mock_resize.assert_not_called()
@ -1139,7 +1142,7 @@ class RBDTestCase(test.TestCase):
self.assertEqual(
1, self.mock_rbd.RBD.return_value.clone.call_count)
self.assertEqual(
2, self.mock_rbd.Image.return_value.close.call_count)
1, self.mock_rbd.Image.return_value.close.call_count)
self.assertTrue(mock_get_clone_depth.called)
self.assertEqual(
1, mock_resize.call_count)
@ -1196,7 +1199,7 @@ class RBDTestCase(test.TestCase):
# We expect the driver to close both volumes, so 2 is expected
self.assertEqual(
3, self.mock_rbd.Image.return_value.close.call_count)
2, self.mock_rbd.Image.return_value.close.call_count)
self.assertTrue(mock_get_clone_depth.called)
mock_enable_repl.assert_not_called()

View File

@ -698,6 +698,7 @@ class RBDDriver(driver.CloneableImageVD, driver.MigrateVD,
except Exception as e:
src_volume.unprotect_snap(clone_snap)
src_volume.remove_snap(clone_snap)
src_volume.close()
msg = (_("Failed to clone '%(src_vol)s@%(src_snap)s' to "
"'%(dest)s', error: %(error)s") %
{'src_vol': src_name,
@ -706,8 +707,6 @@ class RBDDriver(driver.CloneableImageVD, driver.MigrateVD,
'error': e})
LOG.exception(msg)
raise exception.VolumeBackendAPIException(data=msg)
finally:
src_volume.close()
depth = self._get_clone_depth(client, src_name)
# If dest volume is a clone and rbd_max_clone_depth reached,