From: Sage Weil Date: Fri, 10 Jun 2016 12:51:13 +0000 (-0400) Subject: os/bluestore: cache: control insertion point of new buffers X-Git-Tag: v11.0.0~70^2~18 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=f45e4a7d6d03812cf6fbdb4adf0b582d7f2c328e;p=ceph-ci.git os/bluestore: cache: control insertion point of new buffers Signed-off-by: Sage Weil --- diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index f000690f8b3..ec04890f048 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -617,9 +617,9 @@ void BlueStore::BufferSpace::_discard(uint64_t offset, uint64_t length) if (b->data.length()) { bufferlist bl; bl.substr_of(b->data, b->length - tail, tail); - _add_buffer(new Buffer(this, b->state, b->seq, end, bl)); + _add_buffer(new Buffer(this, b->state, b->seq, end, bl), 0, b); } else { - _add_buffer(new Buffer(this, b->state, b->seq, end, tail)); + _add_buffer(new Buffer(this, b->state, b->seq, end, tail), 0, b); } cache->_adjust_buffer_size(b, front - (int64_t)b->length); b->truncate(front); @@ -643,10 +643,10 @@ void BlueStore::BufferSpace::_discard(uint64_t offset, uint64_t length) if (b->data.length()) { bufferlist bl; bl.substr_of(b->data, b->length - keep, keep); - _add_buffer(new Buffer(this, b->state, b->seq, end, bl)); + _add_buffer(new Buffer(this, b->state, b->seq, end, bl), 0, b); _rm_buffer(i); } else { - _add_buffer(new Buffer(this, b->state, b->seq, end, keep)); + _add_buffer(new Buffer(this, b->state, b->seq, end, keep), 0, b); _rm_buffer(i); } cache->_audit_lru("discard end 2"); diff --git a/src/os/bluestore/BlueStore.h b/src/os/bluestore/BlueStore.h index 8796a8046f1..2b17a1e48b6 100644 --- a/src/os/bluestore/BlueStore.h +++ b/src/os/bluestore/BlueStore.h @@ -208,10 +208,10 @@ public: assert(writing.empty()); } - void _add_buffer(Buffer *b) { + void _add_buffer(Buffer *b, int level, Buffer *near) { cache->_audit_lru("_add_buffer start"); buffer_map[b->offset].reset(b); - cache->_add_buffer(b); + cache->_add_buffer(b, level, near); if (b->is_writing()) { writing.push_back(*b); } @@ -258,13 +258,15 @@ public: std::lock_guard l(cache->lock); _discard(offset, bl.length()); _add_buffer(new Buffer(this, Buffer::STATE_WRITING, seq, offset, bl, - flags)); + flags), + (flags & Buffer::FLAG_NOCACHE) ? 0 : 1, nullptr); } void finish_write(uint64_t seq); void did_read(uint64_t offset, bufferlist& bl) { std::lock_guard l(cache->lock); - _discard(offset, bl.length()); - _add_buffer(new Buffer(this, Buffer::STATE_CLEAN, 0, offset, bl)); + Buffer *b = new Buffer(this, Buffer::STATE_CLEAN, 0, offset, bl); + b->cache_private = _discard(offset, bl.length()); + _add_buffer(b, 1, nullptr); } void read(uint64_t offset, uint64_t length, @@ -523,8 +525,15 @@ public: } void _touch_onode(OnodeRef& o); - void _add_buffer(Buffer *b) { - buffer_lru.push_front(*b); + void _add_buffer(Buffer *b, int level, Buffer *near) { + if (near) { + auto q = buffer_lru.iterator_to(*near); + buffer_lru.insert(q, *b); + } else if (level > 0) { + buffer_lru.push_front(*b); + } else { + buffer_lru.push_back(*b); + } buffer_size += b->length; } void _rm_buffer(Buffer *b) {