diff options
author | Sage Weil <sage@newdream.net> | 2012-05-05 15:10:32 -0700 |
---|---|---|
committer | Sage Weil <sage@newdream.net> | 2012-05-05 16:32:22 -0700 |
commit | 77f9dbbafb7f21fb20892b2ebc38e83a55f828ad (patch) | |
tree | 7a67d41ea0d4c5fd1c9666af0cd8ebc13b390220 | |
parent | 385142305a83f58f8aa0a93c98679c4018f98a28 (diff) | |
download | ceph-77f9dbbafb7f21fb20892b2ebc38e83a55f828ad.tar.gz |
objectcacher: specify the WritebackHandler for each ObjectSet
This will allow us to share a single cache between different users.
Also use a pointer rather than a reference.
Signed-off-by: Sage Weil <sage@newdream.net>
-rw-r--r-- | src/client/Client.cc | 8 | ||||
-rw-r--r-- | src/client/Inode.h | 4 | ||||
-rw-r--r-- | src/librbd.cc | 4 | ||||
-rw-r--r-- | src/osdc/ObjectCacher.cc | 42 | ||||
-rw-r--r-- | src/osdc/ObjectCacher.h | 9 |
5 files changed, 33 insertions, 34 deletions
diff --git a/src/client/Client.cc b/src/client/Client.cc index 86d3c7605b9..78f8876bcbb 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -150,7 +150,7 @@ Client::Client(Messenger *m, MonClient *mc) objecter = new Objecter(cct, messenger, monclient, osdmap, client_lock, timer); objecter->set_client_incarnation(0); // client always 0, for now. writeback_handler = new ObjecterWriteback(objecter); - objectcacher = new ObjectCacher(cct, "libcephfs", *writeback_handler, client_lock, + objectcacher = new ObjectCacher(cct, "libcephfs", client_lock, client_flush_set_callback, // all commit callback (void*)this); objectcacher->set_max_size(cct->_conf->client_oc_size); @@ -467,7 +467,7 @@ Inode * Client::add_update_inode(InodeStat *st, utime_t from, int mds) in = inode_map[st->vino]; ldout(cct, 12) << "add_update_inode had " << *in << " caps " << ccap_string(st->cap.caps) << dendl; } else { - in = new Inode(cct, st->vino, &st->layout); + in = new Inode(cct, st->vino, &st->layout, writeback_handler); inode_map[st->vino] = in; if (!root) { root = in; @@ -2920,7 +2920,7 @@ void Client::handle_caps(MClientCaps *m) if (!in) { if (m->get_op() == CEPH_CAP_OP_IMPORT) { ldout(cct, 5) << "handle_caps adding ino " << vino << " on IMPORT" << dendl; - in = new Inode(cct, vino, &m->get_layout()); + in = new Inode(cct, vino, &m->get_layout(), writeback_handler); inode_map[vino] = in; in->ino = vino.ino; in->snapid = vino.snapid; @@ -5677,7 +5677,7 @@ Inode *Client::open_snapdir(Inode *diri) Inode *in; vinodeno_t vino(diri->ino, CEPH_SNAPDIR); if (!inode_map.count(vino)) { - in = new Inode(cct, vino, &diri->layout); + in = new Inode(cct, vino, &diri->layout, writeback_handler); in->ino = diri->ino; in->snapid = CEPH_SNAPDIR; diff --git a/src/client/Inode.h b/src/client/Inode.h index f7c26d91e22..69c2c93451c 100644 --- a/src/client/Inode.h +++ b/src/client/Inode.h @@ -185,7 +185,7 @@ class Inode { ll_ref -= n; } - Inode(CephContext *cct_, vinodeno_t vino, ceph_file_layout *layout) + Inode(CephContext *cct_, vinodeno_t vino, ceph_file_layout *layout, WritebackHandler *wb) : cct(cct_), ino(vino.ino), snapid(vino.snapid), rdev(0), mode(0), uid(0), gid(0), nlink(0), size(0), truncate_seq(1), truncate_size(-1), time_warp_seq(0), max_size(0), version(0), xattr_version(0), @@ -196,7 +196,7 @@ class Inode { exporting_issued(0), exporting_mds(-1), exporting_mseq(0), cap_item(this), flushing_cap_item(this), last_flush_tid(0), snaprealm(0), snaprealm_item(this), snapdir_parent(0), - oset((void *)this, layout->fl_pg_pool, ino), + oset((void *)this, layout->fl_pg_pool, ino, wb), reported_size(0), wanted_max_size(0), requested_max_size(0), _ref(0), ll_ref(0), dir(0), dn_set() diff --git a/src/librbd.cc b/src/librbd.cc index bd43dd2c132..707a1cca8f4 100644 --- a/src/librbd.cc +++ b/src/librbd.cc @@ -146,12 +146,12 @@ namespace librbd { Mutex::Locker l(cache_lock); ldout(cct, 20) << "enabling writback caching..." << dendl; writeback_handler = new LibrbdWriteback(data_ctx, cache_lock); - object_cacher = new ObjectCacher(cct, pname, *writeback_handler, cache_lock, + object_cacher = new ObjectCacher(cct, pname, cache_lock, NULL, NULL); object_cacher->set_max_size(cct->_conf->rbd_cache_size); object_cacher->set_max_dirty(cct->_conf->rbd_cache_max_dirty); object_cacher->set_target_dirty(cct->_conf->rbd_cache_target_dirty); - object_set = new ObjectCacher::ObjectSet(NULL, data_ctx.get_id(), 0); + object_set = new ObjectCacher::ObjectSet(NULL, data_ctx.get_id(), 0, writeback_handler); object_cacher->start(); } } diff --git a/src/osdc/ObjectCacher.cc b/src/osdc/ObjectCacher.cc index ee62de404e4..f16aa22497b 100644 --- a/src/osdc/ObjectCacher.cc +++ b/src/osdc/ObjectCacher.cc @@ -409,11 +409,11 @@ void ObjectCacher::Object::discard(loff_t off, loff_t len) #define dout_prefix *_dout << "objectcacher " -ObjectCacher::ObjectCacher(CephContext *cct_, string name, WritebackHandler& wb, Mutex& l, +ObjectCacher::ObjectCacher(CephContext *cct_, string name, Mutex& l, flush_set_callback_t flush_callback, void *flush_callback_arg) : perfcounter(NULL), - cct(cct_), writeback_handler(wb), name(name), lock(l), + cct(cct_), name(name), lock(l), max_dirty(0), target_dirty(0), max_size(0), flush_set_callback(flush_callback), flush_set_callback_arg(flush_callback_arg), flusher_stop(false), flusher_thread(this), @@ -508,10 +508,10 @@ void ObjectCacher::bh_read(BufferHead *bh) ObjectSet *oset = bh->ob->oset; // go - writeback_handler.read(bh->ob->get_oid(), bh->ob->get_oloc(), - bh->start(), bh->length(), bh->ob->get_snap(), - &onfinish->bl, oset->truncate_size, oset->truncate_seq, - onfinish); + oset->wb->read(bh->ob->get_oid(), bh->ob->get_oloc(), + bh->start(), bh->length(), bh->ob->get_snap(), + &onfinish->bl, oset->truncate_size, oset->truncate_seq, + onfinish); } void ObjectCacher::bh_read_finish(int64_t poolid, sobject_t oid, loff_t start, @@ -606,11 +606,11 @@ void ObjectCacher::bh_write(BufferHead *bh) ObjectSet *oset = bh->ob->oset; // go - tid_t tid = writeback_handler.write(bh->ob->get_oid(), bh->ob->get_oloc(), - bh->start(), bh->length(), - bh->snapc, bh->bl, bh->last_write, - oset->truncate_size, oset->truncate_seq, - oncommit); + tid_t tid = oset->wb->write(bh->ob->get_oid(), bh->ob->get_oloc(), + bh->start(), bh->length(), + bh->snapc, bh->bl, bh->last_write, + oset->truncate_size, oset->truncate_seq, + oncommit); // set bh last_write_tid oncommit->tid = tid; @@ -1200,9 +1200,9 @@ void ObjectCacher::rdlock(Object *o) commit->tid = ack->tid = - o->last_write_tid = writeback_handler.lock(o->get_oid(), o->get_oloc(), - CEPH_OSD_OP_RDLOCK, 0, - ack, commit); + o->last_write_tid = o->oset->wb->lock(o->get_oid(), o->get_oloc(), + CEPH_OSD_OP_RDLOCK, 0, + ack, commit); } // stake our claim. @@ -1247,8 +1247,8 @@ void ObjectCacher::wrlock(Object *o) commit->tid = ack->tid = - o->last_write_tid = writeback_handler.lock(o->get_oid(), o->get_oloc(), - op, 0, ack, commit); + o->last_write_tid = o->oset->wb->lock(o->get_oid(), o->get_oloc(), + op, 0, ack, commit); } // stake our claim. @@ -1293,9 +1293,9 @@ void ObjectCacher::rdunlock(Object *o) o->get_soid(), 0, 0); commit->tid = lockack->tid = - o->last_write_tid = writeback_handler.lock(o->get_oid(), o->get_oloc(), - CEPH_OSD_OP_RDUNLOCK, 0, - lockack, commit); + o->last_write_tid = o->oset->wb->lock(o->get_oid(), o->get_oloc(), + CEPH_OSD_OP_RDUNLOCK, 0, + lockack, commit); } void ObjectCacher::wrunlock(Object *o) @@ -1328,8 +1328,8 @@ void ObjectCacher::wrunlock(Object *o) o->get_soid(), 0, 0); commit->tid = lockack->tid = - o->last_write_tid = writeback_handler.lock(o->get_oid(), o->get_oloc(), - op, 0, lockack, commit); + o->last_write_tid = o->oset->wb->lock(o->get_oid(), o->get_oloc(), + op, 0, lockack, commit); } diff --git a/src/osdc/ObjectCacher.h b/src/osdc/ObjectCacher.h index 4e055e298b9..27733f975fa 100644 --- a/src/osdc/ObjectCacher.h +++ b/src/osdc/ObjectCacher.h @@ -274,6 +274,7 @@ class ObjectCacher { void *parent; inodeno_t ino; + WritebackHandler *wb; uint64_t truncate_seq, truncate_size; int64_t poolid; @@ -281,8 +282,8 @@ class ObjectCacher { int dirty_or_tx; - ObjectSet(void *p, int64_t _poolid, inodeno_t i) - : parent(p), ino(i), truncate_seq(0), + ObjectSet(void *p, int64_t _poolid, inodeno_t i, WritebackHandler *wb) + : parent(p), ino(i), wb(wb), truncate_seq(0), truncate_size(0), poolid(_poolid), dirty_or_tx(0) {} }; @@ -290,8 +291,6 @@ class ObjectCacher { // ******* ObjectCacher ********* // ObjectCacher fields private: - WritebackHandler& writeback_handler; - string name; Mutex& lock; @@ -461,7 +460,7 @@ class ObjectCacher { - ObjectCacher(CephContext *cct_, string name, WritebackHandler& wb, Mutex& l, + ObjectCacher(CephContext *cct_, string name, Mutex& l, flush_set_callback_t flush_callback, void *flush_callback_arg); ~ObjectCacher(); |