Merge "RBD: fix volume reference handling in clone logic" into stable/queens
This commit is contained in:
commit
05f87142c5
|
@ -923,10 +923,13 @@ class RBDTestCase(test.TestCase):
|
||||||
(self.mock_rbd.Image.return_value.protect_snap
|
(self.mock_rbd.Image.return_value.protect_snap
|
||||||
.assert_called_once_with('.'.join(
|
.assert_called_once_with('.'.join(
|
||||||
(self.volume_b.name, 'clone_snap'))))
|
(self.volume_b.name, 'clone_snap'))))
|
||||||
|
# We expect clone() to be called exactly once.
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
1, self.mock_rbd.RBD.return_value.clone.call_count)
|
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(
|
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.assertTrue(mock_get_clone_depth.called)
|
||||||
mock_resize.assert_not_called()
|
mock_resize.assert_not_called()
|
||||||
mock_enable_repl.assert_not_called()
|
mock_enable_repl.assert_not_called()
|
||||||
|
@ -962,7 +965,7 @@ class RBDTestCase(test.TestCase):
|
||||||
image.protect_snap.assert_called_once_with(name + '.clone_snap')
|
image.protect_snap.assert_called_once_with(name + '.clone_snap')
|
||||||
self.assertEqual(1, self.mock_rbd.RBD.return_value.clone.call_count)
|
self.assertEqual(1, self.mock_rbd.RBD.return_value.clone.call_count)
|
||||||
self.assertEqual(
|
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(
|
mock_get_clone_depth.assert_called_once_with(
|
||||||
self.mock_client().__enter__(), self.volume_a.name)
|
self.mock_client().__enter__(), self.volume_a.name)
|
||||||
mock_resize.assert_not_called()
|
mock_resize.assert_not_called()
|
||||||
|
@ -992,7 +995,7 @@ class RBDTestCase(test.TestCase):
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
1, self.mock_rbd.RBD.return_value.clone.call_count)
|
1, self.mock_rbd.RBD.return_value.clone.call_count)
|
||||||
self.assertEqual(
|
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.assertTrue(mock_get_clone_depth.called)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
1, mock_resize.call_count)
|
1, mock_resize.call_count)
|
||||||
|
@ -1049,7 +1052,7 @@ class RBDTestCase(test.TestCase):
|
||||||
|
|
||||||
# We expect the driver to close both volumes, so 2 is expected
|
# We expect the driver to close both volumes, so 2 is expected
|
||||||
self.assertEqual(
|
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)
|
self.assertTrue(mock_get_clone_depth.called)
|
||||||
mock_enable_repl.assert_not_called()
|
mock_enable_repl.assert_not_called()
|
||||||
|
|
||||||
|
|
|
@ -595,6 +595,7 @@ class RBDDriver(driver.CloneableImageVD,
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
src_volume.unprotect_snap(clone_snap)
|
src_volume.unprotect_snap(clone_snap)
|
||||||
src_volume.remove_snap(clone_snap)
|
src_volume.remove_snap(clone_snap)
|
||||||
|
src_volume.close()
|
||||||
msg = (_("Failed to clone '%(src_vol)s@%(src_snap)s' to "
|
msg = (_("Failed to clone '%(src_vol)s@%(src_snap)s' to "
|
||||||
"'%(dest)s', error: %(error)s") %
|
"'%(dest)s', error: %(error)s") %
|
||||||
{'src_vol': src_name,
|
{'src_vol': src_name,
|
||||||
|
@ -603,8 +604,6 @@ class RBDDriver(driver.CloneableImageVD,
|
||||||
'error': e})
|
'error': e})
|
||||||
LOG.exception(msg)
|
LOG.exception(msg)
|
||||||
raise exception.VolumeBackendAPIException(data=msg)
|
raise exception.VolumeBackendAPIException(data=msg)
|
||||||
finally:
|
|
||||||
src_volume.close()
|
|
||||||
|
|
||||||
depth = self._get_clone_depth(client, src_name)
|
depth = self._get_clone_depth(client, src_name)
|
||||||
# If dest volume is a clone and rbd_max_clone_depth reached,
|
# If dest volume is a clone and rbd_max_clone_depth reached,
|
||||||
|
|
Loading…
Reference in New Issue