]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: allow striping to be specified on image creation
authorSage Weil <sage@inktank.com>
Mon, 1 Oct 2012 21:46:34 +0000 (14:46 -0700)
committerSage Weil <sage@inktank.com>
Mon, 15 Oct 2012 22:34:03 +0000 (15:34 -0700)
Signed-off-by: Sage Weil <sage@inktank.com>
src/include/rbd/librbd.h
src/include/rbd/librbd.hpp
src/librbd/ImageCtx.cc
src/librbd/internal.cc
src/librbd/internal.h
src/librbd/librbd.cc

index 0178831703d5c104911926d3d8b6502db4a12b5e..0a23949df1e0f182da7fa2f7a127bf950d391a93 100644 (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);
index ec22113a86c727ffd9db71eec3e04620c57888e4..760ecfe58318e4ccbd94e1c8184dc1eb215cbc72 100644 (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);
index 41e07352910d13579e30c0153b60c173b7210fb1..8043aa8f0df4b05e26c72eed41f3c854eb91895f 100644 (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;
   }
 
index 703566013a783e6bcb3c3feb5634bafd924bf8d0..cc9cd68e9eb301ff5a9023d768b0708cb5548d02 100644 (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;
index 2e1bd8675a7910fc26003bedb9fd9a529da22c30..231e214f8bf3a315d56c171a05abf8faa004bcb4 100644 (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);
index dab0cafed17473567f3a8d2bbcae0560b0eb006d..5865d40ac261222c9d09cf704a66de95cb4eb430 100644 (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,