Merge "Add support for RBD fast-diff feature for backups stored in Ceph"

This commit is contained in:
Zuul 2021-03-24 20:39:25 +00:00 committed by Gerrit Code Review
commit 6fed64d07e
3 changed files with 56 additions and 17 deletions

View File

@ -243,6 +243,11 @@ class CephBackupDriver(driver.BackupDriver):
"""Determine if journaling is supported by our version of librbd.""" """Determine if journaling is supported by our version of librbd."""
return hasattr(self.rbd, 'RBD_FEATURE_JOURNALING') return hasattr(self.rbd, 'RBD_FEATURE_JOURNALING')
@property
def _supports_fast_diff(self):
"""Determine if fast-diff is supported by our version of librbd."""
return hasattr(self.rbd, 'RBD_FEATURE_FAST_DIFF')
def _get_rbd_support(self): def _get_rbd_support(self):
"""Determine RBD features supported by our version of librbd.""" """Determine RBD features supported by our version of librbd."""
old_format = True old_format = True
@ -254,24 +259,22 @@ class CephBackupDriver(driver.BackupDriver):
old_format = False old_format = False
features |= self.rbd.RBD_FEATURE_STRIPINGV2 features |= self.rbd.RBD_FEATURE_STRIPINGV2
# journaling requires exclusive_lock; check both together
if CONF.backup_ceph_image_journals: if CONF.backup_ceph_image_journals:
if self._supports_exclusive_lock and self._supports_journaling: LOG.debug("RBD journaling supported by backend and requested "
old_format = False "via config. Enabling it together with "
features |= (self.rbd.RBD_FEATURE_EXCLUSIVE_LOCK | "exclusive-lock")
self.rbd.RBD_FEATURE_JOURNALING) old_format = False
else: features |= (self.rbd.RBD_FEATURE_EXCLUSIVE_LOCK |
# FIXME (tasker): when the backup manager supports loading the self.rbd.RBD_FEATURE_JOURNALING)
# driver during its initialization, this exception should be
# moved to the driver's initialization so that it can stop # NOTE(christian_rohmann): Check for fast-diff support and enable it
# the service from starting when the underyling RBD does not if self._supports_fast_diff:
# support the requested features. LOG.debug("RBD also supports fast-diff, enabling it "
LOG.error("RBD journaling not supported - unable to " "together with exclusive-lock and object-map")
"support per image mirroring in backup pool") old_format = False
raise exception.BackupInvalidCephArgs( features |= (self.rbd.RBD_FEATURE_EXCLUSIVE_LOCK |
_("Image Journaling set but RBD backend does " self.rbd.RBD_FEATURE_OBJECT_MAP |
"not support journaling") self.rbd.RBD_FEATURE_FAST_DIFF)
)
return (old_format, features) return (old_format, features)
@ -293,6 +296,16 @@ class CephBackupDriver(driver.BackupDriver):
with rbd_driver.RADOSClient(self, self._ceph_backup_pool): with rbd_driver.RADOSClient(self, self._ceph_backup_pool):
pass pass
# NOTE(christian_rohmann): Check features required for journaling
if CONF.backup_ceph_image_journals:
if not self._supports_exclusive_lock and self._supports_journaling:
LOG.error("RBD journaling not supported - unable to "
"support per image mirroring in backup pool")
raise exception.BackupInvalidCephArgs(
_("Image Journaling set but RBD backend does "
"not support journaling")
)
def _connect_to_rados(self, pool=None): def _connect_to_rados(self, pool=None):
"""Establish connection to the backup Ceph cluster.""" """Establish connection to the backup Ceph cluster."""
client = eventlet.tpool.Proxy(self.rados.Rados( client = eventlet.tpool.Proxy(self.rados.Rados(

View File

@ -235,11 +235,15 @@ class BackupCephTestCase(test.TestCase):
del self.service.rbd.RBD_FEATURE_STRIPINGV2 del self.service.rbd.RBD_FEATURE_STRIPINGV2
del self.service.rbd.RBD_FEATURE_EXCLUSIVE_LOCK del self.service.rbd.RBD_FEATURE_EXCLUSIVE_LOCK
del self.service.rbd.RBD_FEATURE_JOURNALING del self.service.rbd.RBD_FEATURE_JOURNALING
del self.service.rbd.RBD_FEATURE_OBJECT_MAP
del self.service.rbd.RBD_FEATURE_FAST_DIFF
self.assertFalse(hasattr(self.service.rbd, 'RBD_FEATURE_LAYERING')) self.assertFalse(hasattr(self.service.rbd, 'RBD_FEATURE_LAYERING'))
self.assertFalse(hasattr(self.service.rbd, 'RBD_FEATURE_STRIPINGV2')) self.assertFalse(hasattr(self.service.rbd, 'RBD_FEATURE_STRIPINGV2'))
self.assertFalse(hasattr(self.service.rbd, self.assertFalse(hasattr(self.service.rbd,
'RBD_FEATURE_EXCLUSIVE_LOCK')) 'RBD_FEATURE_EXCLUSIVE_LOCK'))
self.assertFalse(hasattr(self.service.rbd, 'RBD_FEATURE_JOURNALING')) self.assertFalse(hasattr(self.service.rbd, 'RBD_FEATURE_JOURNALING'))
self.assertFalse(hasattr(self.service.rbd, 'RBD_FEATURE_OBJECT_MAP'))
self.assertFalse(hasattr(self.service.rbd, 'RBD_FEATURE_FAST_DIFF'))
oldformat, features = self.service._get_rbd_support() oldformat, features = self.service._get_rbd_support()
self.assertTrue(oldformat) self.assertTrue(oldformat)
@ -279,6 +283,17 @@ class BackupCephTestCase(test.TestCase):
self.assertFalse(oldformat) self.assertFalse(oldformat)
self.assertEqual(1 | 2 | 4 | 64, features) self.assertEqual(1 | 2 | 4 | 64, features)
#
# test that FAST_DIFF is enabled if supported by RBD
# this also enables OBJECT_MAP as required by Ceph
#
self.service.rbd.RBD_FEATURE_OBJECT_MAP = 8
self.service.rbd.RBD_FEATURE_FAST_DIFF = 16
oldformat, features = self.service._get_rbd_support()
self.assertFalse(oldformat)
self.assertEqual(1 | 2 | 4 | 8 | 16 | 64, features)
@common_mocks @common_mocks
def test_get_backup_snap_name(self): def test_get_backup_snap_name(self):
snap_name = 'backup.%s.snap.3824923.1412' % (fake.VOLUME3_ID) snap_name = 'backup.%s.snap.3824923.1412' % (fake.VOLUME3_ID)

View File

@ -0,0 +1,11 @@
---
fixes:
- |
RBD driver `bug #1907964
<https://bugs.launchpad.net/cinder/+bug/1907964>`_: Add support
for fast-diff on backup images stored in Ceph.
Provided fast-diff is supported by the backend it will automatically be
enabled and used.
With fast-diff enabled, the generation of diffs between images and
snapshots as well as determining the actual data usage of a snapshot
is speed up significantly.