]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
os/bluestore: cache: control insertion point of new buffers
authorSage Weil <sage@redhat.com>
Fri, 10 Jun 2016 12:51:13 +0000 (08:51 -0400)
committerSage Weil <sage@redhat.com>
Wed, 22 Jun 2016 15:28:40 +0000 (11:28 -0400)
Signed-off-by: Sage Weil <sage@redhat.com>
src/os/bluestore/BlueStore.cc
src/os/bluestore/BlueStore.h

index f000690f8b30b2b4068ae75f03a564e5afbc7fc5..ec04890f048a7c77cb623c491802d54252e39ccb 100644 (file)
@@ -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");
index 8796a8046f134cc02b23be2f7cc9687b63d90fed..2b17a1e48b6c70f202069092ae6cd4a9d18fe105 100644 (file)
@@ -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<std::mutex> 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<std::mutex> 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) {