]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
cls_rbd: asynchronous helper methods to retrieve mirror image metadata
authorJason Dillaman <dillaman@redhat.com>
Wed, 25 May 2016 21:13:59 +0000 (17:13 -0400)
committerJason Dillaman <dillaman@redhat.com>
Wed, 1 Jun 2016 15:52:11 +0000 (11:52 -0400)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit 5a26080447cfa4b7bfdacdc13242569258a64076)

src/cls/rbd/cls_rbd_client.cc
src/cls/rbd/cls_rbd_client.h

index e7bd1cf05716bb97eef4695e44457d304afd6d62..b20c57de95dbcea5cbf6a338bb295191a1e533b8 100644 (file)
@@ -1205,19 +1205,35 @@ namespace librbd {
 
     int mirror_image_get(librados::IoCtx *ioctx, const std::string &image_id,
                         cls::rbd::MirrorImage *mirror_image) {
-      bufferlist in_bl;
+      librados::ObjectReadOperation op;
+      mirror_image_get_start(&op, image_id);
+
       bufferlist out_bl;
-      ::encode(image_id, in_bl);
+      int r = ioctx->operate(RBD_MIRRORING, &op, &out_bl);
+      if (r < 0) {
+       return r;
+      }
 
-      int r = ioctx->exec(RBD_MIRRORING, "rbd", "mirror_image_get", in_bl,
-                         out_bl);
+      bufferlist::iterator iter = out_bl.begin();
+      r = mirror_image_get_finish(&iter, mirror_image);
       if (r < 0) {
-        return r;
+       return r;
       }
+      return 0;
+    }
+
+    void mirror_image_get_start(librados::ObjectReadOperation *op,
+                                const std::string &image_id) {
+      bufferlist in_bl;
+      ::encode(image_id, in_bl);
 
+      op->exec("rbd", "mirror_image_get", in_bl);
+    }
+
+    int mirror_image_get_finish(bufferlist::iterator *iter,
+                               cls::rbd::MirrorImage *mirror_image) {
       try {
-        bufferlist::iterator bl_it = out_bl.begin();
-        ::decode(*mirror_image, bl_it);
+        ::decode(*mirror_image, *iter);
       } catch (const buffer::error &err) {
         return -EBADMSG;
       }
index c23e143cd2867dee67e364134bce4df7e424e011..c3a33ad2b73f990a311618bd30af76c7cd240756 100644 (file)
@@ -243,6 +243,10 @@ namespace librbd {
                                   std::string *image_id);
     int mirror_image_get(librados::IoCtx *ioctx, const std::string &image_id,
                         cls::rbd::MirrorImage *mirror_image);
+    void mirror_image_get_start(librados::ObjectReadOperation *op,
+                                const std::string &image_id);
+    int mirror_image_get_finish(bufferlist::iterator *iter,
+                               cls::rbd::MirrorImage *mirror_image);
     int mirror_image_set(librados::IoCtx *ioctx, const std::string &image_id,
                         const cls::rbd::MirrorImage &mirror_image);
     int mirror_image_remove(librados::IoCtx *ioctx,