Merge "RBD: fix volume reference handling in clone logic" into stable/train
This commit is contained in:
commit
e79b98367b
|
@ -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()
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue