diff --git a/cinder/tests/unit/volume/drivers/test_rbd.py b/cinder/tests/unit/volume/drivers/test_rbd.py index f60bc30ef77..b6d3861ebba 100644 --- a/cinder/tests/unit/volume/drivers/test_rbd.py +++ b/cinder/tests/unit/volume/drivers/test_rbd.py @@ -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() diff --git a/cinder/volume/drivers/rbd.py b/cinder/volume/drivers/rbd.py index 4174ca1ac8e..3c5d09dbe39 100644 --- a/cinder/volume/drivers/rbd.py +++ b/cinder/volume/drivers/rbd.py @@ -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,