librbd: allow striping to be specified on image creation

Signed-off-by: Sage Weil <sage@inktank.com>
This commit is contained in:
Sage Weil 2012-10-01 14:46:34 -07:00
parent 4ef9a3d2c4
commit d6501dbed5
6 changed files with 62 additions and 8 deletions

View File

@ -70,6 +70,9 @@ int rbd_list(rados_ioctx_t io, char *names, size_t *size);
int rbd_create(rados_ioctx_t io, const char *name, uint64_t size, int *order);
int rbd_create2(rados_ioctx_t io, const char *name, uint64_t size,
uint64_t features, int *order);
int rbd_create3(rados_ioctx_t io, const char *name, uint64_t size,
uint64_t features, int *order,
uint64_t stripe_unit, uint64_t stripe_count);
int rbd_clone(rados_ioctx_t p_ioctx, const char *p_name,
const char *p_snapname, rados_ioctx_t c_ioctx,
const char *c_name, uint64_t features, int *c_order);

View File

@ -76,6 +76,9 @@ public:
int create(IoCtx& io_ctx, const char *name, uint64_t size, int *order);
int create2(IoCtx& io_ctx, const char *name, uint64_t size,
uint64_t features, int *order);
int create3(IoCtx& io_ctx, const char *name, uint64_t size,
uint64_t features, int *order,
uint64_t stripe_unit, uint64_t stripe_count);
int clone(IoCtx& p_ioctx, const char *p_name, const char *p_snapname,
IoCtx& c_ioctx, const char *c_name, uint64_t features,
int *c_order);

View File

@ -136,6 +136,11 @@ namespace librbd {
header_oid = old_header_name(name);
}
if (stripe_unit == 0 || stripe_count == 0) {
stripe_unit = 1ull << order;
stripe_count = 1;
}
return 0;
}

View File

@ -670,12 +670,15 @@ reprotect_and_return_err:
}
int create(IoCtx& io_ctx, const char *imgname, uint64_t size,
bool old_format, uint64_t features, int *order)
bool old_format, uint64_t features, int *order,
uint64_t stripe_unit, uint64_t stripe_count)
{
CephContext *cct = (CephContext *)io_ctx.cct();
ldout(cct, 20) << "create " << &io_ctx << " name = " << imgname
<< " size = " << size << " old_format = " << old_format
<< " features = " << features << " order = " << *order
<< " stripe_unit = " << stripe_unit
<< " stripe_count = " << stripe_count
<< dendl;
@ -704,7 +707,24 @@ reprotect_and_return_err:
if (!*order)
*order = RBD_DEFAULT_OBJ_ORDER;
// normalize for default striping
if (stripe_unit == (1ull << *order) && stripe_count == 1) {
stripe_unit = 0;
stripe_count = 0;
}
if ((stripe_unit || stripe_count) &&
(features & RBD_FEATURE_STRIPINGV2) == 0)
return -EINVAL;
if ((stripe_unit && !stripe_count) ||
(!stripe_unit && stripe_count))
return -EINVAL;
if (old_format) {
if (stripe_unit && stripe_unit != (1ull << *order))
return -EINVAL;
if (stripe_count && stripe_count != 1)
return -EINVAL;
ldout(cct, 2) << "adding rbd image to directory..." << dendl;
r = tmap_set(io_ctx, imgname);
if (r < 0) {
@ -753,6 +773,11 @@ reprotect_and_return_err:
oss << RBD_DATA_PREFIX << id;
r = cls_client::create_image(&io_ctx, header_name(id), size, *order,
features, oss.str());
if (r == 0 &&
(stripe_unit || stripe_count) &&
(stripe_count != 1 || stripe_unit != (1ull<<*order))) {
r = cls_client::set_stripe_unit_count(&io_ctx, header_name(id), stripe_unit, stripe_count);
}
}
if (r < 0) {
@ -843,7 +868,7 @@ reprotect_and_return_err:
if (!order)
order = p_imctx->order;
r = create(c_ioctx, c_name, size, false, features, &order);
r = create(c_ioctx, c_name, size, false, features, &order, p_imctx->stripe_unit, p_imctx->stripe_count);
if (r < 0) {
lderr(cct) << "error creating child: " << cpp_strerror(r) << dendl;
goto err_close_parent;
@ -1717,7 +1742,7 @@ reprotect_and_return_err:
int order = ictx->order;
r = create(dest_md_ctx, destname, src_size, ictx->old_format,
ictx->features, &order);
ictx->features, &order, ictx->stripe_unit, ictx->stripe_count);
if (r < 0) {
lderr(cct) << "header creation failed" << dendl;
return r;

View File

@ -79,7 +79,8 @@ namespace librbd {
int list_children(ImageCtx *ictx,
std::set<pair<std::string, std::string> > & names);
int create(librados::IoCtx& io_ctx, const char *imgname, uint64_t size,
bool old_format, uint64_t features, int *order);
bool old_format, uint64_t features, int *order,
uint64_t stripe_unit, uint64_t stripe_count);
int clone(IoCtx& p_ioctx, const char *p_name, const char *p_snap_name,
IoCtx& c_ioctx, const char *c_name,
uint64_t features, int *c_order);

View File

@ -102,13 +102,20 @@ namespace librbd {
int RBD::create(IoCtx& io_ctx, const char *name, uint64_t size, int *order)
{
return librbd::create(io_ctx, name, size, true, 0, order);
return librbd::create(io_ctx, name, size, true, 0, order, 0, 0);
}
int RBD::create2(IoCtx& io_ctx, const char *name, uint64_t size,
uint64_t features, int *order)
{
return librbd::create(io_ctx, name, size, false, features, order);
return librbd::create(io_ctx, name, size, false, features, order, 0, 0);
}
int RBD::create3(IoCtx& io_ctx, const char *name, uint64_t size,
uint64_t features, int *order, uint64_t stripe_unit,
uint64_t stripe_count)
{
return librbd::create(io_ctx, name, size, false, features, order, stripe_unit, stripe_count);
}
int RBD::clone(IoCtx& p_ioctx, const char *p_name, const char *p_snap_name,
@ -468,7 +475,7 @@ extern "C" int rbd_create(rados_ioctx_t p, const char *name, uint64_t size, int
{
librados::IoCtx io_ctx;
librados::IoCtx::from_rados_ioctx_t(p, io_ctx);
return librbd::create(io_ctx, name, size, true, 0, order);
return librbd::create(io_ctx, name, size, true, 0, order, 0, 0);
}
extern "C" int rbd_create2(rados_ioctx_t p, const char *name,
@ -477,7 +484,17 @@ extern "C" int rbd_create2(rados_ioctx_t p, const char *name,
{
librados::IoCtx io_ctx;
librados::IoCtx::from_rados_ioctx_t(p, io_ctx);
return librbd::create(io_ctx, name, size, false, features, order);
return librbd::create(io_ctx, name, size, false, features, order, 0, 0);
}
extern "C" int rbd_create3(rados_ioctx_t p, const char *name,
uint64_t size, uint64_t features,
int *order,
uint64_t stripe_unit, uint64_t stripe_count)
{
librados::IoCtx io_ctx;
librados::IoCtx::from_rados_ioctx_t(p, io_ctx);
return librbd::create(io_ctx, name, size, false, features, order, stripe_unit, stripe_count);
}
extern "C" int rbd_clone(rados_ioctx_t p_ioctx, const char *p_name,