Merge "rbd: resize volume not cloned but full copy"

This commit is contained in:
Jenkins 2017-05-23 19:54:56 +00:00 committed by Gerrit Code Review
commit 03c85d9651
2 changed files with 32 additions and 9 deletions

View File

@ -904,6 +904,21 @@ class RBDTestCase(test.TestCase):
1, mock_resize.call_count)
mock_enable_repl.assert_not_called()
@common_mocks
def test_create_cloned_volume_different_size_copy_only(self):
self.cfg.rbd_max_clone_depth = 0
with mock.patch.object(self.driver, '_get_clone_depth') as \
mock_get_clone_depth:
# Try with no flatten required
with mock.patch.object(self.driver, '_resize') as mock_resize:
mock_get_clone_depth.return_value = 1
self.volume_b.size = 20
self.driver.create_cloned_volume(self.volume_b, self.volume_a)
self.assertEqual(1, mock_resize.call_count)
@common_mocks
@mock.patch.object(driver.RBDDriver, '_enable_replication')
def test_create_cloned_volume_w_flatten(self, mock_enable_repl):

View File

@ -445,6 +445,19 @@ class RBDDriver(driver.CloneableImageVD,
return self._get_clone_depth(client, parent, depth + 1)
def _extend_if_required(self, volume, src_vref):
"""Extends a volume if required
In case src_vref size is smaller than the size if the requested
new volume call _resize().
"""
if volume.size != src_vref.size:
LOG.debug("resize volume '%(dst_vol)s' from %(src_size)d to "
"%(dst_size)d",
{'dst_vol': volume.name, 'src_size': src_vref.size,
'dst_size': volume.size})
self._resize(volume)
def create_cloned_volume(self, volume, src_vref):
"""Create a cloned volume from another volume.
@ -464,15 +477,15 @@ class RBDDriver(driver.CloneableImageVD,
if self.configuration.rbd_max_clone_depth <= 0:
with RBDVolumeProxy(self, src_name, read_only=True) as vol:
vol.copy(vol.ioctx, dest_name)
self._extend_if_required(volume, src_vref)
return
# Otherwise do COW clone.
with RADOSClient(self) as client:
depth = self._get_clone_depth(client, src_name)
# If source volume is a clone and rbd_max_clone_depth reached,
# flatten the source before cloning. Zero rbd_max_clone_depth means
# infinite is allowed.
# flatten the source before cloning. Zero rbd_max_clone_depth
# means infinite is allowed.
if depth == self.configuration.rbd_max_clone_depth:
LOG.debug("maximum clone depth (%d) has been reached - "
"flattening source volume",
@ -531,12 +544,7 @@ class RBDDriver(driver.CloneableImageVD,
finally:
src_volume.close()
if volume.size != src_vref.size:
LOG.debug("resize volume '%(dst_vol)s' from %(src_size)d to "
"%(dst_size)d",
{'dst_vol': volume.name, 'src_size': src_vref.size,
'dst_size': volume.size})
self._resize(volume)
self._extend_if_required(volume, src_vref)
LOG.debug("clone created successfully")
return volume_update