summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2020-11-14 20:11:01 +0000
committerGerrit Code Review <review@openstack.org>2020-11-14 20:11:01 +0000
commit4f8219af5eb16b3ed6703d6e52c51034d5d4293b (patch)
treea587d4be69361d800d196b72b0f1a55919667eaa
parent400ab54cca6df80fd2ad95b641311773a1071d26 (diff)
parentc92c15b59ae21fdd3bf4f4db2a5aef45615a6266 (diff)
downloadcinder-4f8219af5eb16b3ed6703d6e52c51034d5d4293b.tar.gz
Merge "RBD: Run flatten in a different thread when cloning a volume" into stable/train
-rw-r--r--cinder/tests/unit/volume/drivers/test_rbd.py11
-rw-r--r--cinder/volume/drivers/rbd.py12
-rw-r--r--releasenotes/notes/bug-1898918-b24a93d7d5aff238.yaml7
3 files changed, 22 insertions, 8 deletions
diff --git a/cinder/tests/unit/volume/drivers/test_rbd.py b/cinder/tests/unit/volume/drivers/test_rbd.py
index c60f43443..e1ba497b2 100644
--- a/cinder/tests/unit/volume/drivers/test_rbd.py
+++ b/cinder/tests/unit/volume/drivers/test_rbd.py
@@ -1168,6 +1168,9 @@ class RBDTestCase(test.TestCase):
def test_create_cloned_volume_w_flatten(self, mock_enable_repl):
self.cfg.rbd_max_clone_depth = 1
+ client = self.mock_client.return_value
+ client.__enter__.return_value = client
+
with mock.patch.object(self.driver, '_get_clone_info') as \
mock_get_clone_info:
mock_get_clone_info.return_value = (
@@ -1197,9 +1200,13 @@ class RBDTestCase(test.TestCase):
.assert_called_once_with('.'.join(
(self.volume_b.name, 'clone_snap'))))
- # We expect the driver to close both volumes, so 2 is expected
+ self.mock_proxy.assert_called_once_with(
+ self.driver, self.volume_b.name,
+ client=client, ioctx=client.ioctx)
+
+ # Source volume is closed by direct call of close()
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_enable_repl.assert_not_called()
diff --git a/cinder/volume/drivers/rbd.py b/cinder/volume/drivers/rbd.py
index 101408796..f06162d68 100644
--- a/cinder/volume/drivers/rbd.py
+++ b/cinder/volume/drivers/rbd.py
@@ -716,11 +716,13 @@ class RBDDriver(driver.CloneableImageVD, driver.MigrateVD,
LOG.info("maximum clone depth (%d) has been reached - "
"flattening dest volume",
self.configuration.rbd_max_clone_depth)
- dest_volume = self.rbd.Image(client.ioctx, dest_name)
+
+ # Flatten destination volume
try:
- # Flatten destination volume
- LOG.debug("flattening dest volume %s", dest_name)
- dest_volume.flatten()
+ with RBDVolumeProxy(self, dest_name, client=client,
+ ioctx=client.ioctx) as dest_volume:
+ LOG.debug("flattening dest volume %s", dest_name)
+ dest_volume.flatten()
except Exception as e:
msg = (_("Failed to flatten volume %(volume)s with "
"error: %(error)s.") %
@@ -729,8 +731,6 @@ class RBDDriver(driver.CloneableImageVD, driver.MigrateVD,
LOG.exception(msg)
src_volume.close()
raise exception.VolumeBackendAPIException(data=msg)
- finally:
- dest_volume.close()
try:
# remove temporary snap
diff --git a/releasenotes/notes/bug-1898918-b24a93d7d5aff238.yaml b/releasenotes/notes/bug-1898918-b24a93d7d5aff238.yaml
new file mode 100644
index 000000000..2a81a3f18
--- /dev/null
+++ b/releasenotes/notes/bug-1898918-b24a93d7d5aff238.yaml
@@ -0,0 +1,7 @@
+---
+fixes:
+ - |
+ RBD driver `Bug #1898918
+ <https://bugs.launchpad.net/cinder/+bug/1898918>`_: Fix thread block caused
+ by the flatten operation during cloning a volume. Now the flatten operation
+ is executed in a different thread.