]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: add C and Python bindings for async mirror group snapshot create
authorRamana Raja <rraja@redhat.com>
Wed, 22 Jan 2025 17:26:57 +0000 (12:26 -0500)
committerPrasanna Kumar Kalever <prasanna.kalever@redhat.com>
Thu, 24 Apr 2025 15:56:28 +0000 (21:26 +0530)
Signed-off-by: Ramana Raja <rraja@redhat.com>
src/include/rbd/librbd.h
src/include/rbd/librbd.hpp
src/librbd/librbd.cc
src/pybind/rbd/c_rbd.pxd
src/pybind/rbd/rbd.pyx

index 525a3433a8e5b9a0b0107cfc13ffa277f8942a8d..6a0b6b49e51b2cbea05a665722043ba49ba4f2d4 100644 (file)
@@ -1675,6 +1675,12 @@ CEPH_RBD_API int rbd_mirror_group_create_snapshot(rados_ioctx_t p,
                                                   uint32_t flags,
                                                   char *snap_id,
                                                   size_t *max_snap_id_len);
+CEPH_RBD_API int rbd_aio_mirror_group_create_snapshot(rados_ioctx_t p,
+                                                      const char *name,
+                                                      uint32_t flags,
+                                                      char *snap_id,
+                                                      size_t *max_snap_id_len,
+                                                      rbd_completion_t c);
 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 78e07e1d73452b9e0e15990309ba2f889a6fe803..aa5748f7d1bb09f2f0550c73b685a6b208afdca1 100644 (file)
@@ -586,6 +586,9 @@ public:
   int mirror_group_resync(IoCtx& io_ctx, const char *group_name);
   int mirror_group_create_snapshot(IoCtx& io_ctx, const char *group_name,
                                    uint32_t flags, std::string *snap_id);
+  int aio_mirror_group_create_snapshot(IoCtx& io_ctx, const char *group_name,
+                                       uint32_t flags, std::string *snap_id,
+                                       RBD::AioGroupCompletion *c);
   int mirror_group_get_info(IoCtx& io_ctx, const char *group_name,
                             mirror_group_info_t *mirror_group_info,
                             size_t info_size);
index b467b1e413b068075c19327e14af4a51ac0f7b02..f7b63ffc1033577e3e1bd0ebb0b66e3d53ef7b4a 100644 (file)
@@ -527,6 +527,28 @@ struct C_MirrorGroupGetInfo : public Context {
   }
 };
 
+struct C_MirrorGroupCreateSnapshot : public Context {
+  char *mirror_group_snap_id;
+  Context *on_finish;
+
+  std::string cpp_mirror_group_snap_id;
+
+  C_MirrorGroupCreateSnapshot(char *mirror_group_snap_id,
+                              Context *on_finish)
+    : mirror_group_snap_id(mirror_group_snap_id), on_finish(on_finish) {
+  }
+
+  void finish(int r) override {
+    if (r < 0) {
+      on_finish->complete(r);
+      return;
+    }
+
+    strcpy(mirror_group_snap_id, cpp_mirror_group_snap_id.c_str());
+    on_finish->complete(0);
+  }
+};
+
 struct C_MirrorImageGetGlobalStatus : public Context {
   rbd_mirror_image_global_status_t *mirror_image_global_status;
   Context *on_finish;
@@ -1742,6 +1764,18 @@ namespace librbd {
                                                         flags, snap_id);
   }
 
+  int RBD::aio_mirror_group_create_snapshot(IoCtx& group_ioctx,
+                                            const char *group_name,
+                                            uint32_t flags,
+                                            std::string *snap_id,
+                                            RBD::AioGroupCompletion *c) {
+    librbd::api::Mirror<>::group_snapshot_create(
+      group_ioctx, group_name, flags, snap_id,
+      new C_AioGroupCompletion(group_ioctx, c));
+
+    return 0;
+  }
+
   int RBD::mirror_group_get_info(IoCtx& group_ioctx, const char *group_name,
                                  mirror_group_info_t *mirror_group_info,
                                  size_t info_size) {
@@ -8224,6 +8258,32 @@ extern "C" int rbd_mirror_group_create_snapshot(rados_ioctx_t group_p,
   return 0;
 }
 
+extern "C" int rbd_aio_mirror_group_create_snapshot(
+    rados_ioctx_t group_p, const char *group_name, uint32_t flags,
+    char *snap_id, size_t *max_snap_id_len, rbd_completion_t c) {
+  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);
+
+  librbd::RBD::AioGroupCompletion *comp = (librbd::RBD::AioGroupCompletion *)c;
+
+  auto ctx = new C_MirrorGroupCreateSnapshot(
+   snap_id, new C_AioGroupCompletion(group_ioctx, comp));
+
+  librbd::api::Mirror<>::group_snapshot_create(group_ioctx,
+                                               group_name,
+                                               flags,
+                                               &ctx->cpp_mirror_group_snap_id,
+                                               ctx);
+  return 0;
+}
+
 extern "C" int rbd_mirror_group_get_info(
     rados_ioctx_t group_p, const char *group_name,
     rbd_mirror_group_info_t *mirror_group_info, size_t info_size) {
index 629870004ee07e66768c9399cac2aa1140020441..f781ec0e3810b687f49beaaf67319fecf9e4ed88 100644 (file)
@@ -486,6 +486,11 @@ cdef extern from "rbd/librbd.h" nogil:
                                          const char *gp_name, uint32_t flags,
                                          char *snap_id,
                                          size_t *max_snap_id_len)
+    int rbd_aio_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,
+                                             rbd_completion_t c)
     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 8a79ac5d6372a4dd6d3518b35c9ed97536d08f85..d5a1ec396566621e6a871a100f0476ae21687c3d 100644 (file)
@@ -3085,6 +3085,58 @@ cdef class Group(object):
         finally:
             free(snap_id)
 
+    def aio_mirror_group_create_snapshot(self, flags, oncomplete):
+        """
+        Asynchronously create mirror group snapshot.
+
+        Raises :class:`InvalidArgument` if the group is not in mirror
+        snapshot mode.
+
+        oncomplete will be called with the created snap ID as
+        well as the completion:
+
+        oncomplete(completion, snap_id)
+
+        :param flags: create snapshot flags
+        :type flags: int
+        :param oncomplete: what to do when group snapshot creation is complete
+        :type oncomplete: completion
+        :returns: :class:`Completion` - the completion object
+        :raises: :class:`InvalidArgument`
+        """
+        cdef:
+            size_t max_snap_id_size = RBD_MAX_SNAP_ID_SIZE
+            uint32_t _flags = flags
+            Completion completion
+
+        def oncomplete_(completion_v):
+            cdef:
+                Completion _completion_v = completion_v
+            return_value = _completion_v.get_return_value()
+            if return_value == 0:
+                snap_id = decode_cstr(<char *>_completion_v.buf)
+            else:
+                snap_id = None
+            return oncomplete(_completion_v, snap_id)
+
+        completion = self.__get_completion(oncomplete_)
+        completion.buf = PyBytes_FromStringAndSize(NULL, max_snap_id_size)
+        try:
+            completion.__persist()
+            with nogil:
+                ret = rbd_aio_mirror_group_create_snapshot(
+                  self._ioctx, self._name, _flags, <char *>completion.buf,
+                  &max_snap_id_size, completion.rbd_comp)
+            if ret < 0:
+                raise make_ex(
+                    ret,
+                    'error creating mirror snapshot for group %s' % self.name)
+        except:
+            completion.__unpersist()
+            raise
+
+        return completion
+
     def mirror_group_get_info(self):
         """
         Get mirror info of the group.