From: Jianpeng Ma Date: Fri, 30 Jan 2015 03:29:00 +0000 (+0800) Subject: osdc: add new filed dontneed in BufferHead. X-Git-Tag: v0.93~139^2~7 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=fc76c89d1b3f292ea71a85f85eeafc8ad119dcd0;p=ceph.git osdc: add new filed dontneed in BufferHead. 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 --- diff --git a/src/osdc/ObjectCacher.cc b/src/osdc/ObjectCacher.cc index d94bd31a3982b..a26639f9c8644 100644 --- a/src/osdc/ObjectCacher.cc +++ b/src/osdc/ObjectCacher.cc @@ -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 >::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()) { diff --git a/src/osdc/ObjectCacher.h b/src/osdc/ObjectCacher.h index bed12342d07b6..b2acf986dfb92 100644 --- a/src/osdc/ObjectCacher.h +++ b/src/osdc/ObjectCacher.h @@ -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) {