]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
pybind/rbd: add interface to create mirror group snapshot
authorRamana Raja <rraja@redhat.com>
Tue, 6 Aug 2024 22:34:59 +0000 (18:34 -0400)
committerPrasanna Kumar Kalever <prasanna.kalever@redhat.com>
Thu, 24 Apr 2025 15:56:27 +0000 (21:26 +0530)
... synchronously.

Signed-off-by: Ramana Raja <rraja@redhat.com>
src/include/rbd/librbd.h
src/librbd/librbd.cc
src/pybind/rbd/c_rbd.pxd
src/pybind/rbd/rbd.pyx

index ce797652940fea183f87306a30d91ddcbe666a31..900e60c4fff9afc7b467335667bc844904c76ac4 100644 (file)
@@ -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);
index 300e2dd6425a1f2fb36ba2dffa20681759faa7f8..88df7d089e31eef8a58ff11fa0f2664fe97487a5 100644 (file)
@@ -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;
 }
index 322b279d561cdf73111d879dabe0ebc6506d6850..790fcd89e45fef19dd6930da16c79a9452eb2565 100644 (file)
@@ -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)
index 67302a170f3e5841bfece2b9a72106d86393211d..342e0506c14262c4a475309f60ffd02201d65ed4 100644 (file)
@@ -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 = <char *>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.