From 98677bdfe841c48e37c15dd2397dcd2aa9444e04 Mon Sep 17 00:00:00 2001 From: xie xingguo Date: Thu, 13 Oct 2016 15:32:13 +0800 Subject: [PATCH] os/bluestore: traverse buffer_map in reverse order Which is more efficient. Signed-off-by: xie xingguo --- src/os/bluestore/BlueStore.cc | 46 ++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index da254bbf0e10b..52b3ee2042f3d 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -1042,13 +1042,14 @@ void BlueStore::BufferSpace::split(size_t pos, BlueStore::BufferSpace &r) { std::lock_guard 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()); -- 2.39.5