summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2012-05-05 15:10:32 -0700
committerSage Weil <sage@newdream.net>2012-05-05 16:32:22 -0700
commit77f9dbbafb7f21fb20892b2ebc38e83a55f828ad (patch)
tree7a67d41ea0d4c5fd1c9666af0cd8ebc13b390220
parent385142305a83f58f8aa0a93c98679c4018f98a28 (diff)
downloadceph-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.cc8
-rw-r--r--src/client/Inode.h4
-rw-r--r--src/librbd.cc4
-rw-r--r--src/osdc/ObjectCacher.cc42
-rw-r--r--src/osdc/ObjectCacher.h9
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();