Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

librbd: Asynchronous (v2) image creation #9585

Merged
merged 15 commits into from Aug 10, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
19 changes: 13 additions & 6 deletions src/cls/journal/cls_journal_client.cc
Expand Up @@ -175,15 +175,22 @@ struct C_MutableMetadata : public C_AioExec {

} // anonymous namespace

void create(librados::ObjectWriteOperation *op,
uint8_t order, uint8_t splay, int64_t pool_id) {
bufferlist bl;
::encode(order, bl);
::encode(splay, bl);
::encode(pool_id, bl);

op->exec("journal", "create", bl);
}

int create(librados::IoCtx &ioctx, const std::string &oid, uint8_t order,
uint8_t splay, int64_t pool_id) {
bufferlist inbl;
::encode(order, inbl);
::encode(splay, inbl);
::encode(pool_id, inbl);
librados::ObjectWriteOperation op;
create(&op, order, splay, pool_id);

bufferlist outbl;
int r = ioctx.exec(oid, "journal", "create", inbl, outbl);
int r = ioctx.operate(oid, &op);
if (r < 0) {
return r;
}
Expand Down
2 changes: 2 additions & 0 deletions src/cls/journal/cls_journal_client.h
Expand Up @@ -18,6 +18,8 @@ namespace cls {
namespace journal {
namespace client {

void create(librados::ObjectWriteOperation *op,
uint8_t order, uint8_t splay, int64_t pool_id);
int create(librados::IoCtx &ioctx, const std::string &oid, uint8_t order,
uint8_t splay, int64_t pool_id);

Expand Down
160 changes: 117 additions & 43 deletions src/cls/rbd/cls_rbd_client.cc
Expand Up @@ -149,17 +149,26 @@ namespace librbd {
parent);
}

int create_image(librados::IoCtx *ioctx, const std::string &oid,
uint64_t size, uint8_t order, uint64_t features,
const std::string &object_prefix)
void create_image(librados::ObjectWriteOperation *op, uint64_t size, uint8_t order,

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd leave all the sync versions that are still needed by librbd -- just have the sync version call the async version to setup the object operation.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The sync versions do use the async helpers which got introduced in the prior commit. This commit changes the sync version to use async helpers.

uint64_t features, const std::string &object_prefix)
{
bufferlist bl, bl2;
bufferlist bl;
::encode(size, bl);
::encode(order, bl);
::encode(features, bl);
::encode(object_prefix, (bl));

return ioctx->exec(oid, "rbd", "create", bl, bl2);
op->exec("rbd", "create", bl);
}

int create_image(librados::IoCtx *ioctx, const std::string &oid,
uint64_t size, uint8_t order, uint64_t features,
const std::string &object_prefix)
{
librados::ObjectWriteOperation op;
create_image(&op, size, order, features, object_prefix);

return ioctx->operate(oid, &op);
}

int get_features(librados::IoCtx *ioctx, const std::string &oid,
Expand Down Expand Up @@ -723,15 +732,24 @@ namespace librbd {
return get_stripe_unit_count_finish(&it, stripe_unit, stripe_count);
}

void set_stripe_unit_count(librados::ObjectWriteOperation *op,
uint64_t stripe_unit, uint64_t stripe_count)
{
bufferlist bl;
::encode(stripe_unit, bl);
::encode(stripe_count, bl);

op->exec("rbd", "set_stripe_unit_count", bl);
}

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 ************************/

Expand Down Expand Up @@ -764,11 +782,19 @@ namespace librbd {
return get_id_finish(&it, id);
}

void set_id(librados::ObjectWriteOperation *op, const std::string id)
{
bufferlist bl;
::encode(id, bl);
op->exec("rbd", "set_id", bl);
}

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 ********************/
Expand Down Expand Up @@ -844,22 +870,41 @@ namespace librbd {
return 0;
}

void dir_add_image(librados::ObjectWriteOperation *op,
const std::string &name, const std::string &id)
{
bufferlist bl;
::encode(name, bl);
::encode(id, bl);
op->exec("rbd", "dir_add_image", bl);
}

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,
const std::string &name, const std::string &id)
{
bufferlist bl;
::encode(name, bl);
::encode(id, bl);

op->exec("rbd", "dir_remove_image", bl);
}

void dir_rename_image(librados::ObjectWriteOperation *op,
Expand Down Expand Up @@ -1061,26 +1106,42 @@ namespace librbd {
return 0;
}

void mirror_mode_get_start(librados::ObjectReadOperation *op) {
bufferlist bl;
op->exec("rbd", "mirror_mode_get", bl);
}

int mirror_mode_get_finish(bufferlist::iterator *it,
cls::rbd::MirrorMode *mirror_mode) {
try {
uint32_t mirror_mode_decode;
::decode(mirror_mode_decode, *it);
*mirror_mode = static_cast<cls::rbd::MirrorMode>(mirror_mode_decode);
} catch (const buffer::error &err) {
return -EBADMSG;
}

return 0;
}

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;
} else if (r < 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;
}
Expand Down Expand Up @@ -1251,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;
}
Expand All @@ -1274,28 +1335,41 @@ namespace librbd {
return 0;
}

void mirror_image_set(librados::ObjectWriteOperation *op,
const std::string &image_id,
const cls::rbd::MirrorImage &mirror_image) {
bufferlist bl;
::encode(image_id, bl);
::encode(mirror_image, bl);

op->exec("rbd", "mirror_image_set", bl);
}

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;
}
return 0;
}

void mirror_image_remove(librados::ObjectWriteOperation *op,
const std::string &image_id) {
bufferlist bl;
::encode(image_id, bl);

op->exec("rbd", "mirror_image_remove", bl);
}

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;
}
Expand Down
17 changes: 17 additions & 0 deletions src/cls/rbd/cls_rbd_client.h
Expand Up @@ -47,6 +47,8 @@ namespace librbd {
parent_info *parent);

// low-level interface (mainly for testing)
void create_image(librados::ObjectWriteOperation *op, uint64_t size, uint8_t order,
uint64_t features, const std::string &object_prefix);
int create_image(librados::IoCtx *ioctx, const std::string &oid,
uint64_t size, uint8_t order, uint64_t features,
const std::string &object_prefix);
Expand Down Expand Up @@ -136,6 +138,8 @@ namespace librbd {
int get_stripe_unit_count(librados::IoCtx *ioctx, const std::string &oid,
uint64_t *stripe_unit, uint64_t *stripe_count);

void set_stripe_unit_count(librados::ObjectWriteOperation *op,
uint64_t stripe_unit, uint64_t stripe_count);
int set_stripe_unit_count(librados::IoCtx *ioctx, const std::string &oid,
uint64_t stripe_unit, uint64_t stripe_count);
int metadata_list(librados::IoCtx *ioctx, const std::string &oid,
Expand All @@ -157,6 +161,7 @@ namespace librbd {
int get_id_finish(bufferlist::iterator *it, std::string *id);
int get_id(librados::IoCtx *ioctx, const std::string &oid, std::string *id);

void set_id(librados::ObjectWriteOperation *op, std::string id);
int set_id(librados::IoCtx *ioctx, const std::string &oid, std::string id);

// operations on rbd_directory objects
Expand All @@ -170,10 +175,14 @@ namespace librbd {
int dir_list(librados::IoCtx *ioctx, const std::string &oid,
const std::string &start, uint64_t max_return,
map<string, string> *images);
void dir_add_image(librados::ObjectWriteOperation *op,
const std::string &name, const std::string &id);
int dir_add_image(librados::IoCtx *ioctx, const std::string &oid,
const std::string &name, const std::string &id);
int dir_remove_image(librados::IoCtx *ioctx, const std::string &oid,
const std::string &name, const std::string &id);
void dir_remove_image(librados::ObjectWriteOperation *op,
const std::string &name, const std::string &id);
// atomic remove and add
void dir_rename_image(librados::ObjectWriteOperation *op,
const std::string &src, const std::string &dest,
Expand Down Expand Up @@ -219,6 +228,9 @@ namespace librbd {
// operations on the rbd_mirroring object
int mirror_uuid_get(librados::IoCtx *ioctx, std::string *uuid);
int mirror_uuid_set(librados::IoCtx *ioctx, const std::string &uuid);
void mirror_mode_get_start(librados::ObjectReadOperation *op);
int mirror_mode_get_finish(bufferlist::iterator *it,
cls::rbd::MirrorMode *mirror_mode);
int mirror_mode_get(librados::IoCtx *ioctx,
cls::rbd::MirrorMode *mirror_mode);
int mirror_mode_set(librados::IoCtx *ioctx,
Expand Down Expand Up @@ -253,8 +265,13 @@ namespace librbd {
const std::string &image_id);
int mirror_image_get_finish(bufferlist::iterator *iter,
cls::rbd::MirrorImage *mirror_image);
void mirror_image_set(librados::ObjectWriteOperation *op,
const std::string &image_id,
const cls::rbd::MirrorImage &mirror_image);
int mirror_image_set(librados::IoCtx *ioctx, const std::string &image_id,
const cls::rbd::MirrorImage &mirror_image);
void mirror_image_remove(librados::ObjectWriteOperation *op,
const std::string &image_id);
int mirror_image_remove(librados::IoCtx *ioctx,
const std::string &image_id);
int mirror_image_status_set(librados::IoCtx *ioctx,
Expand Down