]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
librbd: speed up diskusage and resize
authorshun-s <song.shun3@zte.com.cn>
Fri, 19 Jan 2018 06:59:50 +0000 (14:59 +0800)
committershun-s <song.shun3@zte.com.cn>
Tue, 6 Feb 2018 01:43:46 +0000 (09:43 +0800)
  speed up diskusage and resize

Signed-off-by: shun-s <song.shun3@zte.com.cn>
src/cls/rbd/cls_rbd.cc
src/librbd/api/DiffIterate.cc
src/librbd/object_map/ResizeRequest.cc

index fb9e246c76d87ceb779208304a69b3574947b7c2..6d4b439f1f9d46500325c27dcfccee6dafbc819c 100644 (file)
@@ -2500,8 +2500,11 @@ int object_map_resize(cls_method_context_t hctx, bufferlist *in, bufferlist *out
 
   size_t orig_object_map_size = object_map.size();
   if (object_count < orig_object_map_size) {
-    for (uint64_t i = object_count + 1; i < orig_object_map_size; ++i) {
-      if (object_map[i] != default_state) {
+    auto it = object_map.begin() + object_count;
+    auto end_it = object_map.end() ;
+    uint64_t i = object_count;
+    for (; it != end_it; ++it, ++i) {
+      if (*it != default_state) {
        CLS_ERR("object map indicates object still exists: %" PRIu64, i);
        return -ESTALE;
       }
@@ -2509,8 +2512,10 @@ int object_map_resize(cls_method_context_t hctx, bufferlist *in, bufferlist *out
     object_map.resize(object_count);
   } else if (object_count > orig_object_map_size) {
     object_map.resize(object_count);
-    for (uint64_t i = orig_object_map_size; i < object_count; ++i) {
-      object_map[i] = default_state;
+    auto it = object_map.begin() + orig_object_map_size;
+    auto end_it = object_map.end();
+    for (; it != end_it; ++it) {
+      *it = default_state;
     }
   }
 
index ea7e70d5d98335077cc43e12b8c206f8658b2c16..7b07634cfa69a72312152f5b356d73ccf77c5eae 100644 (file)
@@ -456,35 +456,40 @@ int DiffIterate<I>::diff_object_map(uint64_t from_snap_id, uint64_t to_snap_id,
       return -EINVAL;
     }
     object_map.resize(num_objs);
+    object_diff_state->resize(object_map.size());
 
     uint64_t overlap = std::min(object_map.size(), prev_object_map.size());
-    for (uint64_t i = 0; i < overlap; ++i) {
+    auto it = object_map.begin();
+    auto overlap_end_it = it + overlap;
+    auto pre_it = prev_object_map.begin();
+    auto diff_it = object_diff_state->begin();
+    uint64_t i = 0;
+    for (; it != overlap_end_it; ++it, ++pre_it, ++diff_it, ++i) {
       ldout(cct, 20) << __func__ << ": object state: " << i << " "
-                     << static_cast<uint32_t>(prev_object_map[i])
-                     << "->" << static_cast<uint32_t>(object_map[i]) << dendl;
-      if (object_map[i] == OBJECT_NONEXISTENT) {
-        if (prev_object_map[i] != OBJECT_NONEXISTENT) {
-          (*object_diff_state)[i] = OBJECT_DIFF_STATE_HOLE;
+                     << static_cast<uint32_t>(*pre_it)
+                     << "->" << static_cast<uint32_t>(*it) << dendl;
+      if (*it == OBJECT_NONEXISTENT) {
+        if (*pre_it != OBJECT_NONEXISTENT) {
+          *diff_it = OBJECT_DIFF_STATE_HOLE;
         }
-      } else if (object_map[i] == OBJECT_EXISTS ||
-                 (prev_object_map[i] != object_map[i] &&
-                  !(prev_object_map[i] == OBJECT_EXISTS &&
-                    object_map[i] == OBJECT_EXISTS_CLEAN))) {
-        (*object_diff_state)[i] = OBJECT_DIFF_STATE_UPDATED;
+      } else if (*it == OBJECT_EXISTS ||
+                 (*pre_it != *it &&
+                  !(*pre_it == OBJECT_EXISTS &&
+                    *it == OBJECT_EXISTS_CLEAN))) {
+        *diff_it = OBJECT_DIFF_STATE_UPDATED;
       }
     }
     ldout(cct, 20) << "diff_object_map: computed overlap diffs" << dendl;
-
-    object_diff_state->resize(object_map.size());
+    auto end_it = object_map.end();
     if (object_map.size() > prev_object_map.size() &&
         (diff_from_start || prev_object_map_valid)) {
-      for (uint64_t i = overlap; i < object_diff_state->size(); ++i) {
+      for (; it != end_it; ++it,++diff_it, ++i) {
         ldout(cct, 20) << __func__ << ": object state: " << i << " "
-                       << "->" << static_cast<uint32_t>(object_map[i]) << dendl;
-        if (object_map[i] == OBJECT_NONEXISTENT) {
-          (*object_diff_state)[i] = OBJECT_DIFF_STATE_NONE;
+                       << "->" << static_cast<uint32_t>(*it) << dendl;
+        if (*it == OBJECT_NONEXISTENT) {
+          *diff_it = OBJECT_DIFF_STATE_NONE;
         } else {
-          (*object_diff_state)[i] = OBJECT_DIFF_STATE_UPDATED;
+          *diff_it = OBJECT_DIFF_STATE_UPDATED;
         }
       }
     }
index 3182c8aef91ca94f89dbcb8b3ed414d6b23befc4..b33134b0b134c821d9e7706d39a52f6dceeb0493 100644 (file)
@@ -19,8 +19,12 @@ void ResizeRequest::resize(ceph::BitVector<2> *object_map, uint64_t num_objs,
                            uint8_t default_state) {
   size_t orig_object_map_size = object_map->size();
   object_map->resize(num_objs);
-  for (uint64_t i = orig_object_map_size; i < object_map->size(); ++i) {
-    (*object_map)[i] = default_state;
+  if (num_objs > orig_object_map_size) {
+    auto it = object_map->begin() + orig_object_map_size;
+    auto end_it = object_map->begin() + num_objs;
+    for (;it != end_it; ++it) {
+      *it = default_state;
+    }
   }
 }