From d58585aa741e10e87ff9397b5aeba0cc2a852f00 Mon Sep 17 00:00:00 2001 From: Ramana Raja Date: Tue, 6 Aug 2024 18:34:59 -0400 Subject: [PATCH] pybind/rbd: add interface to create mirror group snapshot ... synchronously. Signed-off-by: Ramana Raja --- src/include/rbd/librbd.h | 3 ++- src/librbd/librbd.cc | 14 ++++++++++---- src/pybind/rbd/c_rbd.pxd | 4 ++++ src/pybind/rbd/rbd.pyx | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 49 insertions(+), 5 deletions(-) diff --git a/src/include/rbd/librbd.h b/src/include/rbd/librbd.h index ce797652940fe..900e60c4fff9a 100644 --- a/src/include/rbd/librbd.h +++ b/src/include/rbd/librbd.h @@ -1651,7 +1651,8 @@ CEPH_RBD_API int rbd_mirror_group_resync(rados_ioctx_t p, const char *name); CEPH_RBD_API int rbd_mirror_group_create_snapshot(rados_ioctx_t p, const char *name, uint32_t flags, - char **snap_id); + char *snap_id, + size_t *max_snap_id_len); CEPH_RBD_API int rbd_mirror_group_get_info( rados_ioctx_t p, const char *name, rbd_mirror_group_info_t *mirror_group_info, size_t info_size); diff --git a/src/librbd/librbd.cc b/src/librbd/librbd.cc index 300e2dd6425a1..88df7d089e31e 100644 --- a/src/librbd/librbd.cc +++ b/src/librbd/librbd.cc @@ -7953,8 +7953,16 @@ extern "C" int rbd_mirror_group_resync(rados_ioctx_t group_p, extern "C" int rbd_mirror_group_create_snapshot(rados_ioctx_t group_p, const char *group_name, uint32_t flags, - char **snap_id) + char *snap_id, + size_t *max_snap_id_len) { + if (*max_snap_id_len < RBD_MAX_IMAGE_ID_LENGTH + 1) { + *max_snap_id_len = RBD_MAX_IMAGE_ID_LENGTH + 1; + return -ERANGE; + } + + *max_snap_id_len = RBD_MAX_IMAGE_ID_LENGTH + 1; + librados::IoCtx group_ioctx; librados::IoCtx::from_rados_ioctx_t(group_p, group_ioctx); @@ -7965,9 +7973,7 @@ extern "C" int rbd_mirror_group_create_snapshot(rados_ioctx_t group_p, return r; } - if (snap_id != NULL) { - *snap_id = strdup(cpp_snap_id.c_str()); - } + strcpy(snap_id, cpp_snap_id.c_str()); return 0; } diff --git a/src/pybind/rbd/c_rbd.pxd b/src/pybind/rbd/c_rbd.pxd index 322b279d561cd..790fcd89e45fe 100644 --- a/src/pybind/rbd/c_rbd.pxd +++ b/src/pybind/rbd/c_rbd.pxd @@ -478,6 +478,10 @@ cdef extern from "rbd/librbd.h" nogil: void rbd_mirror_image_info_list_cleanup(char **image_ids, rbd_mirror_image_info_t *info_entries, size_t num_entries) + int rbd_mirror_group_create_snapshot(rados_ioctx_t gp_ioctx, + const char *gp_name, uint32_t flags, + char *snap_id, + size_t *max_snap_id_len) int rbd_mirror_group_get_info(rados_ioctx_t gp_ioctx, const char *gp_name, rbd_mirror_group_info_t *mirror_gp_info, size_t info_size) diff --git a/src/pybind/rbd/rbd.pyx b/src/pybind/rbd/rbd.pyx index 67302a170f3e5..342e0506c1426 100644 --- a/src/pybind/rbd/rbd.pyx +++ b/src/pybind/rbd/rbd.pyx @@ -179,6 +179,9 @@ RBD_ENCRYPTION_ALGORITHM_AES256 = _RBD_ENCRYPTION_ALGORITHM_AES256 RBD_WRITE_ZEROES_FLAG_THICK_PROVISION = _RBD_WRITE_ZEROES_FLAG_THICK_PROVISION +RBD_MAX_SNAP_ID_SIZE = 15 + + class Error(Exception): pass @@ -2974,6 +2977,36 @@ cdef class Group(object): if ret != 0: raise make_ex(ret, 'error rolling back group to snapshot', group_errno_to_exception) + def mirror_group_create_snapshot(self, flags=0): + """ + Create mirror group snapshot. + + :param flags: create snapshot flags + :type flags: int + :returns: str - group snapshot ID + """ + cdef: + uint32_t _flags = flags + char *snap_id = NULL + size_t max_snap_id_size = RBD_MAX_SNAP_ID_SIZE + int ret = -errno.ERANGE + try: + while ret == -errno.ERANGE: + snap_id = realloc_chk(snap_id, max_snap_id_size) + with nogil: + ret = rbd_mirror_group_create_snapshot(self._ioctx, + self._name, + _flags, snap_id, + &max_snap_id_size) + if ret != 0: + raise make_ex(ret, + 'error creating snapshot of group %s' % self._name, + group_errno_to_exception) + + return decode_cstr(snap_id) + finally: + free(snap_id) + def mirror_group_get_info(self): """ Get mirror info of the group. -- 2.39.5