RBD: Query volume features from ceph.conf

This patch enabled RADOSClient to query the local ceph.conf for rbd
features configuration, falling back to layering if nothing is found.
This allows users to disable default features or to opt in to upcoming
features that have not yet become default.

Change-Id: I758e028abd703942ceb1c5b63c4b734817bc5df3
This commit is contained in:
Jon Bernard
2015-02-24 16:16:26 -05:00
parent 276af38b3f
commit 6211d8fa20
2 changed files with 12 additions and 6 deletions

View File

@@ -167,7 +167,7 @@ class RBDTestCase(test.TestCase):
args = [client.ioctx, str(self.volume_name),
self.volume_size * units.Gi, order]
kwargs = {'old_format': False,
'features': self.mock_rbd.RBD_FEATURE_LAYERING}
'features': client.features}
self.mock_rbd.RBD.return_value.create.assert_called_once_with(
*args, **kwargs)
client.__enter__.assert_called_once_with()
@@ -762,7 +762,7 @@ class RBDTestCase(test.TestCase):
args = [client_stack[0].ioctx, str(src_image), str(src_snap),
client_stack[1].ioctx, str(self.volume_name)]
kwargs = {'features': self.mock_rbd.RBD_FEATURE_LAYERING}
kwargs = {'features': client.features}
self.mock_rbd.RBD.return_value.clone.assert_called_once_with(
*args, **kwargs)
self.assertEqual(client.__enter__.call_count, 2)

View File

@@ -247,6 +247,13 @@ class RADOSClient(object):
def __exit__(self, type_, value, traceback):
self.driver._disconnect_from_rados(self.cluster, self.ioctx)
@property
def features(self):
features = self.cluster.conf_get('rbd_default_features')
if ((features is None) or (int(features) == 0)):
features = self.driver.rbd.RBD_FEATURE_LAYERING
return int(features)
class RBDDriver(driver.VolumeDriver):
"""Implements RADOS block device (RBD) volume commands."""
@@ -471,7 +478,7 @@ class RBDDriver(driver.VolumeDriver):
'dest': dest_name})
self.rbd.RBD().clone(client.ioctx, src_name, clone_snap,
client.ioctx, dest_name,
features=self.rbd.RBD_FEATURE_LAYERING)
features=client.features)
except Exception as exc:
src_volume.unprotect_snap(clone_snap)
src_volume.remove_snap(clone_snap)
@@ -496,7 +503,6 @@ class RBDDriver(driver.VolumeDriver):
chunk_size = CONF.rbd_store_chunk_size * units.Mi
order = int(math.log(chunk_size, 2))
features = self.rbd.RBD_FEATURE_LAYERING
with RADOSClient(self) as client:
self.rbd.RBD().create(client.ioctx,
@@ -504,7 +510,7 @@ class RBDDriver(driver.VolumeDriver):
size,
order,
old_format=False,
features=features)
features=client.features)
def _flatten(self, pool, volume_name):
LOG.debug('flattening %(pool)s/%(img)s' %
@@ -523,7 +529,7 @@ class RBDDriver(driver.VolumeDriver):
encodeutils.safe_encode(src_snap),
dest_client.ioctx,
encodeutils.safe_encode(volume['name']),
features=self.rbd.RBD_FEATURE_LAYERING)
features=src_client.features)
def _resize(self, volume, **kwargs):
size = kwargs.get('size', None)