From d2baf76d676e710255cc62f0c8aaca7883ef757f Mon Sep 17 00:00:00 2001 From: Venky Shankar Date: Mon, 27 Jun 2016 12:16:32 +0530 Subject: [PATCH] cls / librbd: use asynchronous image creation state machine ... plus changes in rbd class library to use helpers methods. Signed-off-by: Venky Shankar --- src/cls/rbd/cls_rbd_client.cc | 77 ++++++++++++++++------------------- src/librbd/internal.cc | 31 ++++++++++++-- src/librbd/internal.h | 8 ++++ 3 files changed, 69 insertions(+), 47 deletions(-) diff --git a/src/cls/rbd/cls_rbd_client.cc b/src/cls/rbd/cls_rbd_client.cc index b49fe6a70a9..171e9321967 100644 --- a/src/cls/rbd/cls_rbd_client.cc +++ b/src/cls/rbd/cls_rbd_client.cc @@ -165,13 +165,10 @@ namespace librbd { uint64_t size, uint8_t order, uint64_t features, const std::string &object_prefix) { - bufferlist bl, bl2; - ::encode(size, bl); - ::encode(order, bl); - ::encode(features, bl); - ::encode(object_prefix, (bl)); + librados::ObjectWriteOperation op; + create_image(&op, size, order, features, object_prefix); - return ioctx->exec(oid, "rbd", "create", bl, bl2); + return ioctx->operate(oid, &op); } int get_features(librados::IoCtx *ioctx, const std::string &oid, @@ -748,10 +745,10 @@ namespace librbd { int set_stripe_unit_count(librados::IoCtx *ioctx, const std::string &oid, uint64_t stripe_unit, uint64_t stripe_count) { - bufferlist in, out; - ::encode(stripe_unit, in); - ::encode(stripe_count, in); - return ioctx->exec(oid, "rbd", "set_stripe_unit_count", in, out); + librados::ObjectWriteOperation op; + set_stripe_unit_count(&op, stripe_unit, stripe_count); + + return ioctx->operate(oid, &op); } /************************ rbd_id object methods ************************/ @@ -794,9 +791,10 @@ namespace librbd { int set_id(librados::IoCtx *ioctx, const std::string &oid, std::string id) { - bufferlist in, out; - ::encode(id, in); - return ioctx->exec(oid, "rbd", "set_id", in, out); + librados::ObjectWriteOperation op; + set_id(&op, id); + + return ioctx->operate(oid, &op); } /******************** rbd_directory object methods ********************/ @@ -884,19 +882,19 @@ namespace librbd { int dir_add_image(librados::IoCtx *ioctx, const std::string &oid, const std::string &name, const std::string &id) { - bufferlist in, out; - ::encode(name, in); - ::encode(id, in); - return ioctx->exec(oid, "rbd", "dir_add_image", in, out); + librados::ObjectWriteOperation op; + dir_add_image(&op, name, id); + + return ioctx->operate(oid, &op); } int dir_remove_image(librados::IoCtx *ioctx, const std::string &oid, const std::string &name, const std::string &id) { - bufferlist in, out; - ::encode(name, in); - ::encode(id, in); - return ioctx->exec(oid, "rbd", "dir_remove_image", in, out); + librados::ObjectWriteOperation op; + dir_remove_image(&op, name, id); + + return ioctx->operate(oid, &op); } void dir_remove_image(librados::ObjectWriteOperation *op, @@ -1128,10 +1126,11 @@ namespace librbd { int mirror_mode_get(librados::IoCtx *ioctx, cls::rbd::MirrorMode *mirror_mode) { - bufferlist in_bl; + librados::ObjectReadOperation op; + mirror_mode_get_start(&op); + bufferlist out_bl; - int r = ioctx->exec(RBD_MIRRORING, "rbd", "mirror_mode_get", in_bl, - out_bl); + int r = ioctx->operate(RBD_MIRRORING, &op, &out_bl); if (r == -ENOENT) { *mirror_mode = cls::rbd::MIRROR_MODE_DISABLED; return 0; @@ -1139,13 +1138,10 @@ namespace librbd { return r; } - try { - bufferlist::iterator bl_it = out_bl.begin(); - uint32_t mirror_mode_decode; - ::decode(mirror_mode_decode, bl_it); - *mirror_mode = static_cast(mirror_mode_decode); - } catch (const buffer::error &err) { - return -EBADMSG; + bufferlist::iterator it = out_bl.begin(); + r = mirror_mode_get_finish(&it, mirror_mode); + if (r < 0) { + return r; } return 0; } @@ -1316,7 +1312,7 @@ namespace librbd { bufferlist::iterator iter = out_bl.begin(); r = mirror_image_get_finish(&iter, mirror_image); if (r < 0) { - return r; + return r; } return 0; } @@ -1351,13 +1347,10 @@ namespace librbd { int mirror_image_set(librados::IoCtx *ioctx, const std::string &image_id, const cls::rbd::MirrorImage &mirror_image) { - bufferlist in_bl; - ::encode(image_id, in_bl); - ::encode(mirror_image, in_bl); + librados::ObjectWriteOperation op; + mirror_image_set(&op, image_id, mirror_image); - bufferlist out_bl; - int r = ioctx->exec(RBD_MIRRORING, "rbd", "mirror_image_set", in_bl, - out_bl); + int r = ioctx->operate(RBD_MIRRORING, &op); if (r < 0) { return r; } @@ -1373,12 +1366,10 @@ namespace librbd { } int mirror_image_remove(librados::IoCtx *ioctx, const std::string &image_id) { - bufferlist in_bl; - ::encode(image_id, in_bl); + librados::ObjectWriteOperation op; + mirror_image_remove(&op, image_id); - bufferlist out_bl; - int r = ioctx->exec(RBD_MIRRORING, "rbd", "mirror_image_remove", in_bl, - out_bl); + int r = ioctx->operate(RBD_MIRRORING, &op); if (r < 0) { return r; } diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index b033b7b6d2e..e7502e58f8f 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -24,6 +24,7 @@ #include "librbd/AioImageRequest.h" #include "librbd/AioImageRequestWQ.h" #include "librbd/AioObjectRequest.h" +#include "librbd/image/CreateRequest.h" #include "librbd/DiffIterate.h" #include "librbd/ExclusiveLock.h" #include "librbd/ImageCtx.h" @@ -1301,6 +1302,21 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force, return r; } + void create_v2(IoCtx& io_ctx, std::string &imgname, uint64_t size, + int order, uint64_t features, uint64_t stripe_unit, + uint64_t stripe_count, uint8_t journal_order, + uint8_t journal_splay_width, const std::string &journal_pool, + const std::string &non_primary_global_image_id, + const std::string &primary_mirror_uuid, + ContextWQ *op_work_queue, Context *ctx) { + std::string id = util::generate_image_id(io_ctx); + image::CreateRequest<> *req = image::CreateRequest<>::create( + io_ctx, imgname, id, size, order, features, stripe_unit, + stripe_count, journal_order, journal_splay_width, journal_pool, + non_primary_global_image_id, primary_mirror_uuid, op_work_queue, ctx); + req->send(); + } + int create(librados::IoCtx& io_ctx, const char *imgname, uint64_t size, int *order) { @@ -1450,10 +1466,17 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force, opts.get(RBD_IMAGE_OPTION_JOURNAL_SPLAY_WIDTH, &journal_splay_width); opts.get(RBD_IMAGE_OPTION_JOURNAL_POOL, &journal_pool); - r = create_v2(io_ctx, imgname, bid, size, order, features, stripe_unit, - stripe_count, journal_order, journal_splay_width, - journal_pool, non_primary_global_image_id, - primary_mirror_uuid); + C_SaferCond cond; + ContextWQ op_work_queue("librbd::op_work_queue", + cct->_conf->rbd_op_thread_timeout, + ImageCtx::get_thread_pool_instance(cct)); + std::string imagename(imgname); + create_v2(io_ctx, imagename, size, order, features, stripe_unit, + stripe_count, journal_order, journal_splay_width, journal_pool, + non_primary_global_image_id, primary_mirror_uuid, + &op_work_queue, &cond); + r = cond.wait(); + op_work_queue.drain(); } int r1 = opts.set(RBD_IMAGE_OPTION_ORDER, order); diff --git a/src/librbd/internal.h b/src/librbd/internal.h index e73d1d01785..06b012b9be1 100644 --- a/src/librbd/internal.h +++ b/src/librbd/internal.h @@ -14,6 +14,7 @@ #include "include/rbd/librbd.hpp" #include "include/rbd_types.h" #include "librbd/parent_types.h" +#include "common/WorkQueue.h" enum { l_librbd_first = 26000, @@ -97,6 +98,13 @@ namespace librbd { std::set > & names); int list_children_info(ImageCtx *ictx, librbd::parent_spec parent_spec, std::map, std::set >& image_info); + void create_v2(IoCtx& io_ctx, std::string &imgname, uint64_t size, + int order, uint64_t features, uint64_t stripe_unit, + uint64_t stripe_count, uint8_t journal_order, + uint8_t journal_splay_width, const std::string &journal_pool, + const std::string &non_primary_global_image_id, + const std::string &primary_mirror_uuid, + ContextWQ *op_work_queue, Context *ctx); int create(librados::IoCtx& io_ctx, const char *imgname, uint64_t size, int *order); int create(librados::IoCtx& io_ctx, const char *imgname, uint64_t size, -- 2.39.5