From: Jianpeng Ma Date: Wed, 10 Jun 2015 07:56:59 +0000 (+0800) Subject: osdc: Make librbd cache handle NOCACHE fadvise flag. X-Git-Tag: v9.0.3~166^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e68ea2c9421160acdcaa7e8bcee7d46a5b46ceed;p=ceph.git osdc: Make librbd cache handle NOCACHE fadvise flag. Signed-off-by: Jianpeng Ma --- diff --git a/src/osdc/ObjectCacher.cc b/src/osdc/ObjectCacher.cc index db6779c7dbf0..daff1052020b 100644 --- a/src/osdc/ObjectCacher.cc +++ b/src/osdc/ObjectCacher.cc @@ -34,6 +34,7 @@ ObjectCacher::BufferHead *ObjectCacher::Object::split(BufferHead *left, loff_t o //inherit and if later access, this auto clean. right->set_dontneed(left->get_dontneed()); + right->set_nocache(left->get_nocache()); right->last_write_tid = left->last_write_tid; right->last_read_tid = left->last_read_tid; @@ -103,6 +104,7 @@ void ObjectCacher::Object::merge_left(BufferHead *left, BufferHead *right) left->last_write = MAX( left->last_write, right->last_write ); left->set_dontneed(right->get_dontneed() ? left->get_dontneed() : false); + left->set_nocache(right->get_nocache() ? left->get_nocache() : false); // waiters for (map >::iterator p = right->waitfor_read.begin(); @@ -918,6 +920,8 @@ void ObjectCacher::bh_write_commit(int64_t poolid, sobject_t oid, loff_t start, if (r >= 0) { // ok! mark bh clean and error-free mark_clean(bh); + if (bh->get_nocache()) + bh_lru_rest.lru_bottouch(bh); hit.push_back(bh); ldout(cct, 10) << "bh_write_commit clean " << *bh << dendl; } else { @@ -1068,6 +1072,7 @@ int ObjectCacher::_readx(OSDRead *rd, ObjectSet *oset, Context *onfinish, uint64_t total_bytes_read = 0; map stripe_map; // final buffer offset -> substring bool dontneed = rd->fadvise_flags & LIBRADOS_OP_FLAG_FADVISE_DONTNEED; + bool nocache = rd->fadvise_flags & LIBRADOS_OP_FLAG_FADVISE_NOCACHE; /* * WARNING: we can only meaningfully return ENOENT if the read request @@ -1172,6 +1177,7 @@ int ObjectCacher::_readx(OSDRead *rd, ObjectSet *oset, Context *onfinish, bh_remove(o, bh_it->second); delete bh_it->second; } else { + bh_it->second->set_nocache(nocache); bh_read(bh_it->second, rd->fadvise_flags); if ((success && onfinish) || last != missing.end()) last = bh_it; @@ -1218,7 +1224,10 @@ int ObjectCacher::_readx(OSDRead *rd, ObjectSet *oset, Context *onfinish, error = bh->error; bytes_in_cache += bh->length(); - touch_bh(bh); + if (bh->get_nocache() && bh->is_clean()) + bh_lru_rest.lru_bottouch(bh); + else + touch_bh(bh); //must be after touch_bh because touch_bh set dontneed false if (dontneed && ((loff_t)ex_it->offset <= bh->start() && (bh->end() <= (loff_t)(ex_it->offset + ex_it->length)))) { @@ -1361,6 +1370,7 @@ int ObjectCacher::writex(OSDWrite *wr, ObjectSet *oset, Context *onfreespace) uint64_t bytes_written = 0; uint64_t bytes_written_in_flush = 0; bool dontneed = wr->fadvise_flags & LIBRADOS_OP_FLAG_FADVISE_DONTNEED; + bool nocache = wr->fadvise_flags & LIBRADOS_OP_FLAG_FADVISE_NOCACHE; for (vector::iterator ex_it = wr->extents.begin(); ex_it != wr->extents.end(); @@ -1372,6 +1382,7 @@ int ObjectCacher::writex(OSDWrite *wr, ObjectSet *oset, Context *onfreespace) // map it all into a single bufferhead. BufferHead *bh = o->map_write(wr); + bool missing = bh->is_missing(); bh->snapc = wr->snapc; bytes_written += bh->length(); @@ -1411,6 +1422,8 @@ int ObjectCacher::writex(OSDWrite *wr, ObjectSet *oset, Context *onfreespace) mark_dirty(bh); if (dontneed) bh->set_dontneed(true); + else if (nocache && missing) + bh->set_nocache(true); else touch_bh(bh); diff --git a/src/osdc/ObjectCacher.h b/src/osdc/ObjectCacher.h index 0bef597fdf65..eeed83a52313 100644 --- a/src/osdc/ObjectCacher.h +++ b/src/osdc/ObjectCacher.h @@ -102,6 +102,7 @@ class ObjectCacher { loff_t start, length; // bh extent in object } ex; bool dontneed; //indicate bh don't need by anyone + bool nocache; //indicate bh don't need by this caller public: Object *ob; @@ -119,6 +120,7 @@ class ObjectCacher { state(STATE_MISSING), ref(0), dontneed(false), + nocache(false), ob(o), last_write_tid(0), last_read_tid(0), @@ -169,6 +171,13 @@ class ObjectCacher { bool get_dontneed() { return dontneed; } + + void set_nocache(bool v) { + nocache = v; + } + bool get_nocache() { + return nocache; + } }; // ******* Object ********* @@ -422,6 +431,7 @@ class ObjectCacher { bh_lru_rest.lru_touch(bh); bh->set_dontneed(false); + bh->set_nocache(false); touch_ob(bh->ob); } void touch_ob(Object *ob) {