]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osdc: add new filed dontneed in BufferHead.
authorJianpeng Ma <jianpeng.ma@intel.com>
Fri, 30 Jan 2015 03:29:00 +0000 (11:29 +0800)
committerJianpeng Ma <jianpeng.ma@intel.com>
Fri, 30 Jan 2015 03:29:00 +0000 (11:29 +0800)
For read/write op with LIBRADOS_OP_FLAG_FADVISE_DONTNEED,
the hit bh set this as true and later move into the tail of LRU in
order to remove in case in short future no ony access.

Signed-off-by: Jianpeng Ma <jianpeng.ma@intel.com>
src/osdc/ObjectCacher.cc
src/osdc/ObjectCacher.h

index d94bd31a3982bd2daae5c9eb9f85ab2c6aa3f514..a26639f9c86447cab8ce994b2d3d0b70b7b135ec 100644 (file)
@@ -31,6 +31,10 @@ ObjectCacher::BufferHead *ObjectCacher::Object::split(BufferHead *left, loff_t o
   
   // split off right
   ObjectCacher::BufferHead *right = new BufferHead(this);
+
+  //inherit and if later access, this auto clean.
+  right->set_dontneed(left->get_dontneed());
+
   right->last_write_tid = left->last_write_tid;
   right->last_read_tid = left->last_read_tid;
   right->set_state(left->get_state());
@@ -98,6 +102,8 @@ void ObjectCacher::Object::merge_left(BufferHead *left, BufferHead *right)
   left->last_write_tid =  MAX( left->last_write_tid, right->last_write_tid );
   left->last_write = MAX( left->last_write, right->last_write );
 
+  left->set_dontneed(right->get_dontneed() ? left->get_dontneed() : false);
+
   // waiters
   for (map<loff_t, list<Context*> >::iterator p = right->waitfor_read.begin();
        p != right->waitfor_read.end();
@@ -2052,7 +2058,10 @@ void ObjectCacher::bh_set_state(BufferHead *bh, int s)
     bh_lru_dirty.lru_insert_top(bh);
   } else if (s != BufferHead::STATE_DIRTY && state == BufferHead::STATE_DIRTY) {
     bh_lru_dirty.lru_remove(bh);
-    bh_lru_rest.lru_insert_top(bh);
+    if (bh->get_dontneed())
+      bh_lru_rest.lru_insert_bot(bh);
+    else
+      bh_lru_rest.lru_insert_top(bh);
   }
 
   if ((s == BufferHead::STATE_TX ||
@@ -2086,7 +2095,10 @@ void ObjectCacher::bh_add(Object *ob, BufferHead *bh)
     bh_lru_dirty.lru_insert_top(bh);
     dirty_or_tx_bh.insert(bh);
   } else {
-    bh_lru_rest.lru_insert_top(bh);
+    if (bh->get_dontneed())
+      bh_lru_rest.lru_insert_bot(bh);
+    else
+      bh_lru_rest.lru_insert_top(bh);
   }
 
   if (bh->is_tx()) {
index bed12342d07b619457106c720d5ed22fb1fb31a1..b2acf986dfb92b9bebd7be183705c188fe636dea 100644 (file)
@@ -99,7 +99,8 @@ class ObjectCacher {
     struct {
       loff_t start, length;   // bh extent in object
     } ex;
-        
+    bool dontneed; //indicate bh don't need by anyone
+
   public:
     Object *ob;
     bufferlist  bl;
@@ -115,6 +116,7 @@ class ObjectCacher {
     BufferHead(Object *o) : 
       state(STATE_MISSING),
       ref(0),
+      dontneed(false),
       ob(o),
       last_write_tid(0),
       last_read_tid(0),
@@ -158,6 +160,13 @@ class ObjectCacher {
       --ref;
       return ref;
     }
+
+    void set_dontneed(bool v) {
+      dontneed = v;
+    }
+    bool get_dontneed() {
+      return dontneed;
+    }
   };
 
   // ******* Object *********
@@ -405,6 +414,8 @@ class ObjectCacher {
       bh_lru_dirty.lru_touch(bh);
     else
       bh_lru_rest.lru_touch(bh);
+
+    bh->set_dontneed(false);
     touch_ob(bh->ob);
   }
   void touch_ob(Object *ob) {