From: Venky Shankar Date: Mon, 12 Sep 2016 13:37:50 +0000 (+0530) Subject: cls_rbd: async helper for dir_get_id() X-Git-Tag: v12.0.1~282^2~13 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7ac0d713c0b596742a4b38614aafd6fbb907fc87;p=ceph.git cls_rbd: async helper for dir_get_id() Signed-off-by: Venky Shankar --- diff --git a/src/cls/rbd/cls_rbd_client.cc b/src/cls/rbd/cls_rbd_client.cc index 804f28386a91..4c218353f64a 100644 --- a/src/cls/rbd/cls_rbd_client.cc +++ b/src/cls/rbd/cls_rbd_client.cc @@ -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; diff --git a/src/cls/rbd/cls_rbd_client.h b/src/cls/rbd/cls_rbd_client.h index d73d70de07b3..8d32d0ff5359 100644 --- a/src/cls/rbd/cls_rbd_client.h +++ b/src/cls/rbd/cls_rbd_client.h @@ -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);