// 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());
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();
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 ||
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()) {
struct {
loff_t start, length; // bh extent in object
} ex;
-
+ bool dontneed; //indicate bh don't need by anyone
+
public:
Object *ob;
bufferlist bl;
BufferHead(Object *o) :
state(STATE_MISSING),
ref(0),
+ dontneed(false),
ob(o),
last_write_tid(0),
last_read_tid(0),
--ref;
return ref;
}
+
+ void set_dontneed(bool v) {
+ dontneed = v;
+ }
+ bool get_dontneed() {
+ return dontneed;
+ }
};
// ******* Object *********
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) {