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

This commit is contained in:
Zuul 2020-04-30 22:20:12 +00:00 committed by Gerrit Code Review
commit 05f87142c5
2 changed files with 8 additions and 6 deletions

View File

@ -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()

View File

@ -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,