From 4b976111236434f7d4f73d6eff7ed464f0758f6a Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Tue, 22 Nov 2016 14:01:30 -0500 Subject: [PATCH] cls/rbd: async versions for dir_list and mirror_image_list Signed-off-by: Jason Dillaman --- src/cls/rbd/cls_rbd_client.cc | 77 ++++++++++++++++++++++++----------- src/cls/rbd/cls_rbd_client.h | 7 ++++ 2 files changed, 60 insertions(+), 24 deletions(-) diff --git a/src/cls/rbd/cls_rbd_client.cc b/src/cls/rbd/cls_rbd_client.cc index 517bea56809e2..804f28386a91f 100644 --- a/src/cls/rbd/cls_rbd_client.cc +++ b/src/cls/rbd/cls_rbd_client.cc @@ -1006,25 +1006,41 @@ namespace librbd { return dir_get_name_finish(&it, name); } + void dir_list_start(librados::ObjectReadOperation *op, + const std::string &start, uint64_t max_return) + { + bufferlist in_bl; + ::encode(start, in_bl); + ::encode(max_return, in_bl); + + op->exec("rbd", "dir_list", in_bl); + } + + int dir_list_finish(bufferlist::iterator *it, map *images) + { + try { + ::decode(*images, *it); + } catch (const buffer::error &err) { + return -EBADMSG; + } + return 0; + } + int dir_list(librados::IoCtx *ioctx, const std::string &oid, const std::string &start, uint64_t max_return, map *images) { - bufferlist in, out; - ::encode(start, in); - ::encode(max_return, in); - int r = ioctx->exec(oid, "rbd", "dir_list", in, out); - if (r < 0) - return r; + librados::ObjectReadOperation op; + dir_list_start(&op, start, max_return); - bufferlist::iterator iter = out.begin(); - try { - ::decode(*images, iter); - } catch (const buffer::error &err) { - return -EBADMSG; + bufferlist out_bl; + int r = ioctx->operate(oid, &op, &out_bl); + if (r < 0) { + return r; } - return 0; + bufferlist::iterator iter = out_bl.begin(); + return dir_list_finish(&iter, images); } void dir_add_image(librados::ObjectWriteOperation *op, @@ -1417,29 +1433,42 @@ namespace librbd { return 0; } - int mirror_image_list(librados::IoCtx *ioctx, - const std::string &start, uint64_t max_return, - std::map *mirror_image_ids) { + void mirror_image_list_start(librados::ObjectReadOperation *op, + const std::string &start, uint64_t max_return) + { bufferlist in_bl; ::encode(start, in_bl); ::encode(max_return, in_bl); + op->exec("rbd", "mirror_image_list", in_bl); + } - bufferlist out_bl; - int r = ioctx->exec(RBD_MIRRORING, "rbd", "mirror_image_list", in_bl, - out_bl); - if (r < 0) { - return r; - } - + int mirror_image_list_finish(bufferlist::iterator *it, + std::map *mirror_image_ids) + { try { - bufferlist::iterator bl_it = out_bl.begin(); - ::decode(*mirror_image_ids, bl_it); + ::decode(*mirror_image_ids, *it); } catch (const buffer::error &err) { return -EBADMSG; } return 0; } + int mirror_image_list(librados::IoCtx *ioctx, + const std::string &start, uint64_t max_return, + std::map *mirror_image_ids) { + librados::ObjectReadOperation op; + mirror_image_list_start(&op, start, max_return); + + bufferlist out_bl; + int r = ioctx->operate(RBD_MIRRORING, &op, &out_bl); + if (r < 0) { + return r; + } + + bufferlist::iterator bl_it = out_bl.begin(); + return mirror_image_list_finish(&bl_it, mirror_image_ids); + } + void mirror_image_get_image_id_start(librados::ObjectReadOperation *op, const std::string &global_image_id) { bufferlist in_bl; diff --git a/src/cls/rbd/cls_rbd_client.h b/src/cls/rbd/cls_rbd_client.h index c1d1bd8bdd906..d73d70de07b3e 100644 --- a/src/cls/rbd/cls_rbd_client.h +++ b/src/cls/rbd/cls_rbd_client.h @@ -210,6 +210,9 @@ namespace librbd { int dir_get_name_finish(bufferlist::iterator *it, std::string *name); int dir_get_name(librados::IoCtx *ioctx, const std::string &oid, const std::string &id, std::string *name); + void dir_list_start(librados::ObjectReadOperation *op, + const std::string &start, uint64_t max_return); + int dir_list_finish(bufferlist::iterator *it, map *images); int dir_list(librados::IoCtx *ioctx, const std::string &oid, const std::string &start, uint64_t max_return, map *images); @@ -287,6 +290,10 @@ namespace librbd { int mirror_peer_set_cluster(librados::IoCtx *ioctx, const std::string &uuid, const std::string &cluster_name); + void mirror_image_list_start(librados::ObjectReadOperation *op, + const std::string &start, uint64_t max_return); + int mirror_image_list_finish(bufferlist::iterator *it, + std::map *mirror_image_ids); int mirror_image_list(librados::IoCtx *ioctx, const std::string &start, uint64_t max_return, std::map *mirror_image_ids); -- 2.39.5