]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
cls_rbd: async helper for dir_get_id()
authorVenky Shankar <vshankar@redhat.com>
Mon, 12 Sep 2016 13:37:50 +0000 (19:07 +0530)
committerDongsheng Yang <dongsheng.yang@easystack.cn>
Tue, 21 Feb 2017 11:17:26 +0000 (19:17 +0800)
Signed-off-by: Venky Shankar <vshankar@redhat.com>
src/cls/rbd/cls_rbd_client.cc
src/cls/rbd/cls_rbd_client.h

index 804f28386a91f30915aa88af0422b4039dc31ed7..4c218353f64a3069d63f10946f80f82f959b5f56 100644 (file)
@@ -956,25 +956,39 @@ namespace librbd {
 
     /******************** rbd_directory object methods ********************/
 
-    int dir_get_id(librados::IoCtx *ioctx, const std::string &oid,
-                  const std::string &name, std::string *id)
-    {
-      bufferlist in, out;
-      ::encode(name, in);
-      int r = ioctx->exec(oid, "rbd", "dir_get_id", in, out);
-      if (r < 0)
-       return r;
+    void dir_get_id_start(librados::ObjectReadOperation *op,
+                          const std::string &image_name) {
+      bufferlist bl;
+      ::encode(image_name, bl);
 
-      bufferlist::iterator iter = out.begin();
+      op->exec("rbd", "dir_get_id", bl);
+    }
+
+    int dir_get_id_finish(bufferlist::iterator *iter, std::string *image_id) {
       try {
-       ::decode(*id, iter);
+        ::decode(*image_id, *iter);
       } catch (const buffer::error &err) {
-       return -EBADMSG;
+        return -EBADMSG;
       }
 
       return 0;
     }
 
+    int dir_get_id(librados::IoCtx *ioctx, const std::string &oid,
+                   const std::string &name, std::string *id) {
+      librados::ObjectReadOperation op;
+      dir_get_id_start(&op, name);
+
+      bufferlist out_bl;
+      int r = ioctx->operate(oid, &op, &out_bl);
+      if (r < 0) {
+        return r;
+      }
+
+      bufferlist::iterator iter = out_bl.begin();
+      return dir_get_id_finish(&iter, id);
+    }
+
     void dir_get_name_start(librados::ObjectReadOperation *op,
                            const std::string &id) {
       bufferlist in_bl;
index d73d70de07b3e1c34ef49d07b6d0cfbca8ba87a3..8d32d0ff535904ecea7acc15960cc4d0277b084b 100644 (file)
@@ -205,6 +205,9 @@ namespace librbd {
     // operations on rbd_directory objects
     int dir_get_id(librados::IoCtx *ioctx, const std::string &oid,
                   const std::string &name, std::string *id);
+    void dir_get_id_start(librados::ObjectReadOperation *op,
+                          const std::string &image_name);
+    int dir_get_id_finish(bufferlist::iterator *iter, std::string *image_id);
     void dir_get_name_start(librados::ObjectReadOperation *op,
                            const std::string &id);
     int dir_get_name_finish(bufferlist::iterator *it, std::string *name);