]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: traverse buffer_map in reverse order
authorxie xingguo <xie.xingguo@zte.com.cn>
Thu, 13 Oct 2016 07:32:13 +0000 (15:32 +0800)
committerxie xingguo <xie.xingguo@zte.com.cn>
Thu, 13 Oct 2016 12:00:51 +0000 (20:00 +0800)
Which is more efficient.

Signed-off-by: xie xingguo <xie.xingguo@zte.com.cn>
src/os/bluestore/BlueStore.cc

index da254bbf0e10bb1f48ffbcd4f7ec23b471718d42..52b3ee2042f3dfa18c5d872ad0c437823b8c77dc 100644 (file)
@@ -1042,13 +1042,14 @@ void BlueStore::BufferSpace::split(size_t pos, BlueStore::BufferSpace &r)
 {
   std::lock_guard<std::recursive_mutex> lk(cache->lock);
   assert(r.cache == cache);
-  auto p = buffer_map.begin();
-  while (p != buffer_map.end() &&
-        p->second->end() <= pos) {
-    dout(30) << __func__ << " skip " << *p->second << dendl;
-    ++p;
-  }
-  if (p != buffer_map.end()) {
+  if (buffer_map.empty())
+    return;
+
+  auto p = --buffer_map.end();
+  while (true) {
+    if (p->second->end() <= pos)
+      break;
+
     if (p->second->offset < pos) {
       dout(30) << __func__ << " cut " << *p->second << dendl;
       size_t left = pos - p->second->offset;
@@ -1063,20 +1064,25 @@ void BlueStore::BufferSpace::split(size_t pos, BlueStore::BufferSpace &r)
                      0, p->second.get());
       }
       p->second->truncate(left);
-      ++p;
+      break;
     }
-    while (p != buffer_map.end()) {
-      dout(30) << __func__ << " move " << *p->second << dendl;
-      if (p->second->data.length()) {
-       r._add_buffer(new Buffer(&r, p->second->state, p->second->seq,
-                                p->second->offset - pos, p->second->data),
-                     0, p->second.get());
-      } else {
-       r._add_buffer(new Buffer(&r, p->second->state, p->second->seq,
-                                p->second->offset - pos, p->second->length),
-                     0, p->second.get());
-      }
-      _rm_buffer(p++);
+
+    assert(p->second->end() > pos);
+    dout(30) << __func__ << " move " << *p->second << dendl;
+    if (p->second->data.length()) {
+      r._add_buffer(new Buffer(&r, p->second->state, p->second->seq,
+                               p->second->offset - pos, p->second->data),
+                    0, p->second.get());
+    } else {
+      r._add_buffer(new Buffer(&r, p->second->state, p->second->seq,
+                               p->second->offset - pos, p->second->length),
+                    0, p->second.get());
+    }
+    if (p == buffer_map.begin()) {
+      _rm_buffer(p);
+      break;
+    } else {
+      _rm_buffer(p--);
     }
   }
   assert(writing.empty());