From: Sage Weil Date: Fri, 10 Jun 2016 12:38:55 +0000 (-0400) Subject: os/bluestore: make buffer lru private X-Git-Tag: v11.0.0~70^2~19 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=3c3dcc63d8a0b78e39061aa7f37a3bde3381e2ab;p=ceph-ci.git os/bluestore: make buffer lru private Signed-off-by: Sage Weil --- diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index f6ada30d9ac..f000690f8b3 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -610,7 +610,7 @@ void BlueStore::BufferSpace::_discard(uint64_t offset, uint64_t length) break; } if (b->offset < offset) { - uint64_t front = offset - b->offset; + int64_t front = offset - b->offset; if (b->end() > end) { // drop middle (split) uint64_t tail = b->end() - end; @@ -621,15 +621,13 @@ void BlueStore::BufferSpace::_discard(uint64_t offset, uint64_t length) } else { _add_buffer(new Buffer(this, b->state, b->seq, end, tail)); } - assert(cache->buffer_size >= b->length - front); - cache->buffer_size -= b->length - front; + cache->_adjust_buffer_size(b, front - (int64_t)b->length); b->truncate(front); cache->_audit_lru("discard end 1"); return; } else { // drop tail - assert(cache->buffer_size >= b->length - front); - cache->buffer_size -= b->length - front; + cache->_adjust_buffer_size(b, front - (int64_t)b->length); b->truncate(front); ++i; continue; diff --git a/src/os/bluestore/BlueStore.h b/src/os/bluestore/BlueStore.h index ee4ab548652..8796a8046f1 100644 --- a/src/os/bluestore/BlueStore.h +++ b/src/os/bluestore/BlueStore.h @@ -211,8 +211,7 @@ public: void _add_buffer(Buffer *b) { cache->_audit_lru("_add_buffer start"); buffer_map[b->offset].reset(b); - cache->buffer_lru.push_front(*b); - cache->buffer_size += b->length; + cache->_add_buffer(b); if (b->is_writing()) { writing.push_back(*b); } @@ -223,9 +222,7 @@ public: } void _rm_buffer(map>::iterator p) { cache->_audit_lru("_rm_buffer start"); - assert(cache->buffer_size >= p->second->length); - cache->buffer_size -= p->second->length; - cache->buffer_lru.erase(cache->buffer_lru.iterator_to(*p->second)); + cache->_rm_buffer(p->second.get()); if (p->second->is_writing()) { writing.erase(writing.iterator_to(*p->second)); } @@ -501,9 +498,6 @@ public: Onode, boost::intrusive::list_member_hook<>, &Onode::lru_item> > onode_lru_list_t; - onode_lru_list_t onode_lru; - - public: typedef boost::intrusive::list< Buffer, boost::intrusive::member_hook< @@ -511,10 +505,15 @@ public: boost::intrusive::list_member_hook<>, &Buffer::lru_item> > buffer_lru_list_t; - std::mutex lock; ///< protect lru and other structures + onode_lru_list_t onode_lru; + buffer_lru_list_t buffer_lru; uint64_t buffer_size = 0; + public: + + std::mutex lock; ///< protect lru and other structures + void _add_onode(OnodeRef& o) { onode_lru.push_front(*o); } @@ -524,6 +523,20 @@ public: } void _touch_onode(OnodeRef& o); + void _add_buffer(Buffer *b) { + buffer_lru.push_front(*b); + buffer_size += b->length; + } + void _rm_buffer(Buffer *b) { + assert(buffer_size >= b->length); + buffer_size -= b->length; + auto q = buffer_lru.iterator_to(*b); + buffer_lru.erase(q); + } + void _adjust_buffer_size(Buffer *b, int64_t delta) { + assert((int64_t)buffer_size + delta >= 0); + buffer_size += delta; + } void _touch_buffer(Buffer *b) { auto p = buffer_lru.iterator_to(*b); buffer_lru.erase(p);