From 5c9ecea87d3eb90201a967d8da827018cd728f0d Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Wed, 18 May 2016 17:50:07 -0400 Subject: [PATCH] cls_rbd: async version of metadata_list helper method Signed-off-by: Jason Dillaman (cherry picked from commit 985cb38211c51c95d84479df231c4f53847cb2ec) --- src/cls/rbd/cls_rbd_client.cc | 34 +++++++++++++++++++++++++--------- src/cls/rbd/cls_rbd_client.h | 4 ++++ 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/cls/rbd/cls_rbd_client.cc b/src/cls/rbd/cls_rbd_client.cc index ec57f7f8daae2..e7bd1cf05716b 100644 --- a/src/cls/rbd/cls_rbd_client.cc +++ b/src/cls/rbd/cls_rbd_client.cc @@ -942,21 +942,37 @@ namespace librbd { const std::string &start, uint64_t max_return, map *pairs) { - assert(pairs); - bufferlist in, out; - ::encode(start, in); - ::encode(max_return, in); - int r = ioctx->exec(oid, "rbd", "metadata_list", in, out); - if (r < 0) + librados::ObjectReadOperation op; + metadata_list_start(&op, start, max_return); + + bufferlist out_bl; + int r = ioctx->operate(oid, &op, &out_bl); + if (r < 0) { return r; + } - bufferlist::iterator iter = out.begin(); + bufferlist::iterator it = out_bl.begin(); + return metadata_list_finish(&it, pairs); + } + + void metadata_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", "metadata_list", in_bl); + } + + int metadata_list_finish(bufferlist::iterator *it, + std::map *pairs) + { + assert(pairs); try { - ::decode(*pairs, iter); + ::decode(*pairs, *it); } catch (const buffer::error &err) { return -EBADMSG; } - return 0; } diff --git a/src/cls/rbd/cls_rbd_client.h b/src/cls/rbd/cls_rbd_client.h index b3dd22eb3753b..c23e143cd2867 100644 --- a/src/cls/rbd/cls_rbd_client.h +++ b/src/cls/rbd/cls_rbd_client.h @@ -135,6 +135,10 @@ namespace librbd { int metadata_list(librados::IoCtx *ioctx, const std::string &oid, const std::string &start, uint64_t max_return, map *pairs); + void metadata_list_start(librados::ObjectReadOperation *op, + const std::string &start, uint64_t max_return); + int metadata_list_finish(bufferlist::iterator *it, + std::map *pairs); int metadata_set(librados::IoCtx *ioctx, const std::string &oid, const map &data); int metadata_remove(librados::IoCtx *ioctx, const std::string &oid, -- 2.39.5