Abstract out how writeback is done with a WritebackHandler object.
For RBD caching, this will be done by librados, but the Client uses
the Objecter directly.
This also requires different locks, since librbd does not have access
to the lock the underlying Objecter uses. Thus, both lock and the
writeback handler are parameters of the ObjectCacher constructor.
Signed-off-by: Josh Durgin <josh.durgin@dreamhost.com>
client/Inode.cc \
client/MetaRequest.cc \
client/Trace.cc
-libclient_la_LIBADD = libcommon.la $(LIBEDIT_LIBS)
+libclient_la_LIBADD = libosdc.la $(LIBEDIT_LIBS)
noinst_LTLIBRARIES += libclient.la
dist-hook:
client/fuse_ll.h\
client/ioctl.h\
client/hadoop/CephFSInterface.h\
+ client/ObjecterWriteback.h\
cls_acl.cc\
cls_crypto.cc\
common/BackTrace.h\
osdc/Journaler.h\
osdc/ObjectCacher.h\
osdc/Objecter.h\
+ osdc/WritebackHandler.h\
perfglue/cpu_profiler.h\
perfglue/heap_profiler.h\
rgw/rgw_acl.h\
#include "mon/MonMap.h"
#include "osdc/Filer.h"
-#include "osdc/Objecter.h"
-#include "osdc/ObjectCacher.h"
+#include "osdc/WritebackHandler.h"
#include "common/Cond.h"
#include "common/Mutex.h"
#include "Fh.h"
#include "MetaSession.h"
#include "MetaRequest.h"
+#include "ObjecterWriteback.h"
#undef dout_prefix
#define dout_prefix *_dout << "client." << whoami << " "
mdsmap = new MDSMap;
objecter = new Objecter(cct, messenger, monclient, osdmap, client_lock, timer);
objecter->set_client_incarnation(0); // client always 0, for now.
- objectcacher = new ObjectCacher(cct, objecter, client_lock,
+ writeback_handler = new ObjecterWriteback(objecter);
+ objectcacher = new ObjectCacher(cct, *writeback_handler, client_lock,
client_flush_set_callback, // all commit callback
(void*)this);
filer = new Filer(objecter);
objectcacher = 0;
}
+ if (writeback_handler) {
+ delete writeback_handler;
+ writeback_handler = NULL;
+ }
+
if (filer) { delete filer; filer = 0; }
if (objecter) { delete objecter; objecter = 0; }
if (osdmap) { delete osdmap; osdmap = 0; }
class Filer;
class Objecter;
-class ObjectCacher;
+class WritebackHandler;
class PerfCounters;
Filer *filer;
ObjectCacher *objectcacher;
Objecter *objecter; // (non-blocking) osd interface
-
+ WritebackHandler *writeback_handler;
+
// cache
hash_map<vinodeno_t, Inode*> inode_map;
Inode* root;
--- /dev/null
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+#ifndef CEPH_OSDC_OBJECTERWRITEBACKHANDLER_H
+#define CEPH_OSDC_OBJECTERWRITEBACKHANDLER_H
+
+#include "osdc/Objecter.h"
+#include "osdc/WritebackHandler.h"
+
+class ObjecterWriteback : public WritebackHandler {
+ public:
+ ObjecterWriteback(Objecter *o) : m_objecter(o) {}
+ virtual ~ObjecterWriteback() {}
+
+ virtual tid_t read(const object_t& oid, const object_locator_t& oloc,
+ uint64_t off, uint64_t len, snapid_t snapid,
+ bufferlist *pbl, uint64_t trunc_size, __u32 trunc_seq,
+ Context *onfinish) {
+ return m_objecter->read_trunc(oid, oloc, off, len, snapid, pbl, 0,
+ trunc_size, trunc_seq, onfinish);
+ }
+
+ virtual tid_t write(const object_t& oid, const object_locator_t& oloc,
+ uint64_t off, uint64_t len, const SnapContext& snapc,
+ const bufferlist &bl, utime_t mtime, uint64_t trunc_size,
+ __u32 trunc_seq, Context *oncommit) {
+ return m_objecter->write_trunc(oid, oloc, off, len, snapc, bl, mtime, 0,
+ trunc_size, trunc_seq, NULL, oncommit);
+ }
+
+ virtual tid_t lock(const object_t& oid, const object_locator_t& oloc, int op,
+ int flags, Context *onack, Context *oncommit) {
+ return m_objecter->lock(oid, oloc, op, flags, onack, oncommit);
+ }
+
+ private:
+ Objecter *m_objecter;
+};
+
+#endif
#include "msg/Messenger.h"
#include "ObjectCacher.h"
-#include "Objecter.h"
-
+#include "WritebackHandler.h"
/*** ObjectCacher::BufferHead ***/
#define dout_subsys ceph_subsys_objectcacher
#undef dout_prefix
-#define dout_prefix *_dout << oc->objecter->messenger->get_myname() << ".objectcacher.object(" << oid << ") "
+#define dout_prefix *_dout << "objectcacher.object(" << oid << ") "
ObjectCacher::
-ObjectCacher(CephContext *cct_, Objecter *o, Mutex& l, flush_set_callback_t flush_callback,
+ObjectCacher(CephContext *cct_, WritebackHandler& wb, Mutex& l,
+ flush_set_callback_t flush_callback,
void *flush_callback_arg) :
- cct(cct_), objecter(o), filer(o), lock(l),
+ cct(cct_), writeback_handler(wb), lock(l),
flush_set_callback(flush_callback), flush_set_callback_arg(flush_callback_arg),
flusher_stop(false), flusher_thread(this),
stat_waiter(0),
/*** ObjectCacher ***/
#undef dout_prefix
-#define dout_prefix *_dout << objecter->messenger->get_myname() << ".objectcacher "
+#define dout_prefix *_dout << "objectcacher "
/* private */
ObjectSet *oset = bh->ob->oset;
// go
- objecter->read_trunc(bh->ob->get_oid(), bh->ob->get_oloc(),
- bh->start(), bh->length(), bh->ob->get_snap(),
- &onfinish->bl, 0,
- oset->truncate_size, oset->truncate_seq,
- onfinish);
+ 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);
}
void ObjectCacher::bh_read_finish(int64_t poolid, sobject_t oid, loff_t start,
ObjectSet *oset = bh->ob->oset;
// go
- tid_t tid = objecter->write_trunc(bh->ob->get_oid(), bh->ob->get_oloc(),
- bh->start(), bh->length(),
- bh->snapc, bh->bl, bh->last_write, 0,
- oset->truncate_size, oset->truncate_seq,
- NULL, oncommit);
+ 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);
// set bh last_write_tid
oncommit->tid = tid;
commit->tid =
ack->tid =
- o->last_write_tid = objecter->lock(o->get_oid(), o->get_oloc(), CEPH_OSD_OP_RDLOCK, 0, ack, commit);
+ o->last_write_tid = writeback_handler.lock(o->get_oid(), o->get_oloc(),
+ CEPH_OSD_OP_RDLOCK, 0,
+ ack, commit);
}
// stake our claim.
commit->tid =
ack->tid =
- o->last_write_tid = objecter->lock(o->get_oid(), o->get_oloc(), op, 0, ack, commit);
+ o->last_write_tid = writeback_handler.lock(o->get_oid(), o->get_oloc(),
+ op, 0, ack, commit);
}
// stake our claim.
o->get_soid(), 0, 0);
commit->tid =
lockack->tid =
- o->last_write_tid = objecter->lock(o->get_oid(), o->get_oloc(), CEPH_OSD_OP_RDUNLOCK, 0, lockack, commit);
+ o->last_write_tid = writeback_handler.lock(o->get_oid(), o->get_oloc(),
+ CEPH_OSD_OP_RDUNLOCK, 0,
+ lockack, commit);
}
void ObjectCacher::wrunlock(Object *o)
o->get_soid(), 0, 0);
commit->tid =
lockack->tid =
- o->last_write_tid = objecter->lock(o->get_oid(), o->get_oloc(), op, 0, lockack, commit);
+ o->last_write_tid = writeback_handler.lock(o->get_oid(), o->get_oloc(),
+ op, 0, lockack, commit);
}
#include "Filer.h"
class CephContext;
-class Objecter;
+class WritebackHandler;
class ObjectCacher {
public:
// ******* ObjectCacher *********
// ObjectCacher fields
- public:
- Objecter *objecter;
- Filer filer;
-
private:
+ WritebackHandler& writeback_handler;
+
Mutex& lock;
flush_set_callback_t flush_set_callback;
public:
- ObjectCacher(CephContext *cct_, Objecter *o, Mutex& l,
+ ObjectCacher(CephContext *cct_, WritebackHandler& wb, Mutex& l,
flush_set_callback_t flush_callback,
void *flush_callback_arg);
~ObjectCacher() {
--- /dev/null
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+#ifndef CEPH_OSDC_WRITEBACKHANDLER_H
+#define CEPH_OSDC_WRITEBACKHANDLER_H
+
+#include "include/Context.h"
+#include "include/types.h"
+#include "osd/osd_types.h"
+
+class WritebackHandler {
+ public:
+ WritebackHandler() {}
+ virtual ~WritebackHandler() {}
+
+ virtual tid_t read(const object_t& oid, const object_locator_t& oloc,
+ uint64_t off, uint64_t len, snapid_t snapid,
+ bufferlist *pbl, uint64_t trunc_size, __u32 trunc_seq,
+ Context *onfinish) = 0;
+ virtual tid_t write(const object_t& oid, const object_locator_t& oloc,
+ uint64_t off, uint64_t len, const SnapContext& snapc,
+ const bufferlist &bl, utime_t mtime, uint64_t trunc_size,
+ __u32 trunc_seq, Context *oncommit) = 0;
+ virtual tid_t lock(const object_t& oid, const object_locator_t& oloc, int op,
+ int flags, Context *onack, Context *oncommit) {
+ assert(0 == "this WritebackHandler does not support the lock operation");
+ }
+};
+
+#endif