]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
cls_rbd: async mirror_uuid_get support
authorJason Dillaman <dillaman@redhat.com>
Wed, 29 Mar 2017 20:22:40 +0000 (16:22 -0400)
committerJason Dillaman <dillaman@redhat.com>
Thu, 30 Mar 2017 13:05:30 +0000 (09:05 -0400)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/cls/rbd/cls_rbd_client.cc
src/cls/rbd/cls_rbd_client.h

index 2a5f6e74d2388b1e923e88b0355498ae42c86328..1a3841060fb38ced4d4de4fc6702c7937775726c 100644 (file)
@@ -1288,20 +1288,35 @@ namespace librbd {
       return 0;
     }
 
+    void mirror_uuid_get_start(librados::ObjectReadOperation *op) {
+      bufferlist bl;
+      op->exec("rbd", "mirror_uuid_get", bl);
+    }
+
+    int mirror_uuid_get_finish(bufferlist::iterator *it,
+                               std::string *uuid) {
+      try {
+        ::decode(*uuid, *it);
+      } catch (const buffer::error &err) {
+        return -EBADMSG;
+      }
+      return 0;
+    }
+
     int mirror_uuid_get(librados::IoCtx *ioctx, std::string *uuid) {
-      bufferlist in_bl;
+      librados::ObjectReadOperation op;
+      mirror_uuid_get_start(&op);
+
       bufferlist out_bl;
-      int r = ioctx->exec(RBD_MIRRORING, "rbd", "mirror_uuid_get", in_bl,
-                          out_bl);
+      int r = ioctx->operate(RBD_MIRRORING, &op, &out_bl);
       if (r < 0) {
         return r;
       }
 
-      try {
-        bufferlist::iterator bl_it = out_bl.begin();
-        ::decode(*uuid, bl_it);
-      } catch (const buffer::error &err) {
-        return -EBADMSG;
+      bufferlist::iterator it = out_bl.begin();
+      r = mirror_uuid_get_finish(&it, uuid);
+      if (r < 0) {
+        return r;
       }
       return 0;
     }
index 0cd232b804624654f2c325e4654b2c228721cfbe..3512089b7e070c25bd8bd6aa47b10a085cb90715 100644 (file)
@@ -272,6 +272,9 @@ namespace librbd {
                          ::SnapContext *snapc);
 
     // operations on the rbd_mirroring object
+    void mirror_uuid_get_start(librados::ObjectReadOperation *op);
+    int mirror_uuid_get_finish(bufferlist::iterator *it,
+                               std::string *uuid);
     int mirror_uuid_get(librados::IoCtx *ioctx, std::string *uuid);
     int mirror_uuid_set(librados::IoCtx *ioctx, const std::string &uuid);
     void mirror_mode_get_start(librados::ObjectReadOperation *op);