From: xie xingguo Date: Thu, 13 Oct 2016 07:32:13 +0000 (+0800) Subject: os/bluestore: traverse buffer_map in reverse order X-Git-Tag: v11.1.0~650^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=98677bdfe841c48e37c15dd2397dcd2aa9444e04;p=ceph.git os/bluestore: traverse buffer_map in reverse order Which is more efficient. Signed-off-by: xie xingguo --- diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index da254bbf0e10..52b3ee2042f3 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());