mirror of
https://github.com/ceph/ceph
synced 2025-02-24 03:27:10 +00:00
librbd: allow striping to be specified on image creation
Signed-off-by: Sage Weil <sage@inktank.com>
This commit is contained in:
parent
4ef9a3d2c4
commit
d6501dbed5
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user