]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
when non-default striping is used, internal methods can operate on extra objects
authorxinxin shu <xinxin.shu@intel.com>
Sat, 27 Sep 2014 19:57:20 +0000 (03:57 +0800)
committerxinxin shu <xinxin.shu@intel.com>
Wed, 15 Oct 2014 23:58:41 +0000 (07:58 +0800)
Fixes: #9595
Signed-off-by: xinxin shu <xinxin.shu@intel.com>
src/librbd/ImageCtx.cc
src/librbd/ImageCtx.h
src/librbd/internal.cc
src/osdc/Striper.cc
src/osdc/Striper.h

index 77211d7c9eaee85f1657ebcc87941cc944454d4d..ae4b14f53828addefb6bb86cc95b3e5f924e241a 100644 (file)
@@ -351,13 +351,6 @@ namespace librbd {
     return stripe_count * (1ull << order);
   }
 
-  uint64_t ImageCtx::get_num_objects() const
-  {
-    uint64_t period = get_stripe_period();
-    uint64_t num_periods = (size + period - 1) / period;
-    return num_periods * stripe_count;
-  }
-
   int ImageCtx::is_snap_protected(snap_t in_snap_id,
                                  bool *is_protected) const
   {
index 2c56461ab41aac54d1075f0f304732b14601affa..36ad046b7fe1e427f20b95d83346326e830bd7e9 100644 (file)
@@ -120,7 +120,6 @@ namespace librbd {
     uint64_t get_current_size() const;
     uint64_t get_object_size() const;
     string get_object_name(uint64_t num) const;
-    uint64_t get_num_objects() const;
     uint64_t get_stripe_unit() const;
     uint64_t get_stripe_count() const;
     uint64_t get_stripe_period() const;
index 545e603e88430b16366385495ba5e0cc3bb15ef2..065b0a431c46067cd501a7c3f331d23af053bbd1 100644 (file)
@@ -119,7 +119,7 @@ namespace librbd {
     ictx->snap_lock.put_read();
     ictx->md_lock.put_read();
     info.obj_size = 1ULL << obj_order;
-    info.num_objs = rbd_howmany(info.size, ictx->get_object_size());
+    info.num_objs = Striper::get_num_objects(ictx->layout, info.size);
     info.order = obj_order;
     memcpy(&info.block_name_prefix, ictx->object_prefix.c_str(),
           min((size_t)RBD_MAX_BLOCK_NAME_SIZE,
@@ -155,7 +155,7 @@ namespace librbd {
     uint64_t delete_off = MIN(num_period * period, size);
     // first object we can delete free and clear
     uint64_t delete_start = num_period * ictx->get_stripe_count();
-    uint64_t num_objects = ictx->get_num_objects();
+    uint64_t num_objects = Striper::get_num_objects(ictx->layout, size);
     uint64_t object_size = ictx->get_object_size();
 
     ldout(cct, 10) << "trim_image " << size << " -> " << newsize
@@ -324,7 +324,7 @@ namespace librbd {
   int rollback_image(ImageCtx *ictx, uint64_t snap_id,
                     ProgressContext& prog_ctx)
   {
-    uint64_t numseg = ictx->get_num_objects();
+    uint64_t numseg = Striper::get_num_objects(ictx->layout, ictx->get_current_size());
     uint64_t bsize = ictx->get_object_size();
     int r;
     CephContext *cct = ictx->cct;
@@ -2183,9 +2183,7 @@ reprotect_and_return_err:
     }
 
     uint64_t object_size;
-    uint64_t period;
     uint64_t overlap;
-    uint64_t overlap_periods;
     uint64_t overlap_objects;
     ::SnapContext snapc;
 
@@ -2209,10 +2207,8 @@ reprotect_and_return_err:
       assert(ictx->parent_md.overlap <= ictx->size);
 
       object_size = ictx->get_object_size();
-      period = ictx->get_stripe_period();
       overlap = ictx->parent_md.overlap;
-      overlap_periods = (overlap + period - 1) / period;
-      overlap_objects = overlap_periods * ictx->get_stripe_count();
+      overlap_objects = Striper::get_num_objects(ictx->layout, overlap); 
     }
 
     SimpleThrottle throttle(cct->_conf->rbd_concurrent_management_ops, false);
index d99518a49cd16ed52c1d3c9ef16247bb85831d78..2706c78265678060f68517954402c780ed86dd9a 100644 (file)
@@ -213,6 +213,19 @@ uint64_t Striper::object_truncate_size(CephContext *cct, const ceph_file_layout
                 << trunc_size << "->" << obj_trunc_size << dendl;
   return obj_trunc_size;
 }
+uint64_t Striper::get_num_objects(const ceph_file_layout& layout, uint64_t size)
+{
+  __u32 object_size = layout.fl_object_size;
+  __u32 stripe_unit = layout.fl_stripe_unit;
+  __u32 stripe_count = layout.fl_stripe_count;
+  uint64_t period = stripe_count * object_size;
+  uint64_t num_periods = (size + period - 1) / period;
+  uint64_t remainder_bytes = size % period;
+  uint64_t remainder_objs = 0;
+  if ((remainder_bytes > 0) && (remainder_bytes < stripe_count * stripe_unit))
+    remainder_objs = stripe_count - ((remainder_bytes + stripe_unit - 1) / stripe_unit);
+  return num_periods * stripe_count - remainder_objs;
+}
 
 // StripedReadResult
 
index cc5c0ed7a72084fa800c45928beed213540837df..b7879379088455cd0ac68c42f4693c3621db4f37 100644 (file)
@@ -64,6 +64,7 @@ class CephContext;
     static uint64_t object_truncate_size(CephContext *cct, const ceph_file_layout *layout,
                                         uint64_t objectno, uint64_t trunc_size);
 
+    static uint64_t get_num_objects(const ceph_file_layout& layout, uint64_t size);
     /*
      * helper to assemble a striped result
      */