]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
cls/rbd: added async version of get_snapcontext
authorJason Dillaman <dillaman@redhat.com>
Thu, 16 Nov 2017 21:46:11 +0000 (16:46 -0500)
committerJason Dillaman <dillaman@redhat.com>
Tue, 21 Nov 2017 14:17:40 +0000 (09:17 -0500)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/cls/rbd/cls_rbd_client.cc
src/cls/rbd/cls_rbd_client.h

index 026d1219d680b5c0dedf860d0641bb10da15743f..90c25c6bcc2956fb0a6e737231cae1efdf932275 100644 (file)
@@ -517,28 +517,42 @@ namespace librbd {
       op->exec("rbd", "snapshot_rename", bl);
     }
 
-    int get_snapcontext(librados::IoCtx *ioctx, const std::string &oid,
-                       ::SnapContext *snapc)
+    void get_snapcontext_start(librados::ObjectReadOperation *op)
     {
-      bufferlist inbl, outbl;
-
-      int r = ioctx->exec(oid, "rbd", "get_snapcontext", inbl, outbl);
-      if (r < 0)
-       return r;
+      bufferlist bl;
+      op->exec("rbd", "get_snapcontext", bl);
+    }
 
+    int get_snapcontext_finish(bufferlist::iterator *it,
+                               ::SnapContext *snapc)
+    {
       try {
-       bufferlist::iterator iter = outbl.begin();
-       ::decode(*snapc, iter);
+       ::decode(*snapc, *it);
       } catch (const buffer::error &err) {
        return -EBADMSG;
       }
-
-      if (!snapc->is_valid())
+      if (!snapc->is_valid()) {
        return -EBADMSG;
-
+      }
       return 0;
     }
 
+    int get_snapcontext(librados::IoCtx *ioctx, const std::string &oid,
+                       ::SnapContext *snapc)
+    {
+      librados::ObjectReadOperation op;
+      get_snapcontext_start(&op);
+
+      bufferlist out_bl;
+      int r = ioctx->operate(oid, &op, &out_bl);
+      if (r < 0) {
+       return r;
+      }
+
+      auto bl_it = out_bl.begin();
+      return get_snapcontext_finish(&bl_it, snapc);
+    }
+
     void snapshot_list_start(librados::ObjectReadOperation *op,
                              const std::vector<snapid_t> &ids) {
       for (auto snap_id : ids) {
index 4afe4b1112cabeb8cafd5ac4aa346205c01e78e9..dd0b27d52bd8c350db60aa9e0d77cca926033a2a 100644 (file)
@@ -112,6 +112,9 @@ namespace librbd {
     void snapshot_rename(librados::ObjectWriteOperation *op,
                        snapid_t src_snap_id,
                        const std::string &dst_name);
+    void get_snapcontext_start(librados::ObjectReadOperation *op);
+    int get_snapcontext_finish(bufferlist::iterator *it,
+                               ::SnapContext *snapc);
     int get_snapcontext(librados::IoCtx *ioctx, const std::string &oid,
                        ::SnapContext *snapc);