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,
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 ************************/
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 ********************/
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,
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;
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<cls::rbd::MirrorMode>(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;
}
bufferlist::iterator iter = out_bl.begin();
r = mirror_image_get_finish(&iter, mirror_image);
if (r < 0) {
- return r;
+ return r;
}
return 0;
}
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;
}
}
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;
}
#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"
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)
{
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);
#include "include/rbd/librbd.hpp"
#include "include/rbd_types.h"
#include "librbd/parent_types.h"
+#include "common/WorkQueue.h"
enum {
l_librbd_first = 26000,
std::set<std::pair<std::string, std::string> > & names);
int list_children_info(ImageCtx *ictx, librbd::parent_spec parent_spec,
std::map<std::pair<int64_t, std::string >, std::set<std::string> >& 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,