diff options
author | Yehuda Sadeh <yehuda@inktank.com> | 2013-02-28 09:56:43 -0800 |
---|---|---|
committer | Yehuda Sadeh <yehuda@inktank.com> | 2013-03-22 11:23:58 -0700 |
commit | 0ef98d4afe05e9d429d08d5083868f91c6c37f5f (patch) | |
tree | 1aa1644938108c322deda5ea1a01de42b7d7bed8 | |
parent | 83a8d37b38c7ab5444fce19e3ca7b192d776e8a4 (diff) | |
download | ceph-0ef98d4afe05e9d429d08d5083868f91c6c37f5f.tar.gz |
librados: add two more ObjectOperation::exec()
- one that also gets out bufferlist and ret value pointer
- one that gets a callback context
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
-rw-r--r-- | src/include/rados/librados.hpp | 9 | ||||
-rw-r--r-- | src/librados/librados.cc | 30 | ||||
-rw-r--r-- | src/osdc/Objecter.h | 16 |
3 files changed, 53 insertions, 2 deletions
diff --git a/src/include/rados/librados.hpp b/src/include/rados/librados.hpp index 887b6aa3e44..3617bfd7347 100644 --- a/src/include/rados/librados.hpp +++ b/src/include/rados/librados.hpp @@ -110,6 +110,13 @@ namespace librados OP_FAILOK = 2, }; + + class ObjectOperationCompletion { + public: + virtual ~ObjectOperationCompletion() {} + virtual void handle_completion(int r, bufferlist& outbl) = 0; + }; + /* * ObjectOperation : compount object operation * Batch multiple object operations into a single request, to be applied @@ -131,6 +138,8 @@ namespace librados void src_cmpxattr(const std::string& src_oid, const char *name, int op, uint64_t v); void exec(const char *cls, const char *method, bufferlist& inbl); + void exec(const char *cls, const char *method, bufferlist& inbl, bufferlist *obl, int *prval); + void exec(const char *cls, const char *method, bufferlist& inbl, ObjectOperationCompletion *completion); /** * Guard operation with a check that object version == ver * diff --git a/src/librados/librados.cc b/src/librados/librados.cc index 0a00cfc6df2..47cc6ef0c54 100644 --- a/src/librados/librados.cc +++ b/src/librados/librados.cc @@ -133,6 +133,36 @@ void librados::ObjectOperation::exec(const char *cls, const char *method, buffer o->call(cls, method, inbl); } +void librados::ObjectOperation::exec(const char *cls, const char *method, bufferlist& inbl, bufferlist *outbl, int *prval) +{ + ::ObjectOperation *o = (::ObjectOperation *)impl; + o->call(cls, method, inbl, outbl, NULL, prval); +} + +class ObjectOpCompletionCtx : public Context { + librados::ObjectOperationCompletion *completion; + bufferlist bl; +public: + ObjectOpCompletionCtx(librados::ObjectOperationCompletion *c) : completion(c) {} + void finish(int r) { + completion->handle_completion(r, bl); + delete completion; + } + + bufferlist *outbl() { + return &bl; + } +}; + +void librados::ObjectOperation::exec(const char *cls, const char *method, bufferlist& inbl, librados::ObjectOperationCompletion *completion) +{ + ::ObjectOperation *o = (::ObjectOperation *)impl; + + ObjectOpCompletionCtx *ctx = new ObjectOpCompletionCtx(completion); + + o->call(cls, method, inbl, ctx->outbl(), ctx, NULL); +} + void librados::ObjectReadOperation::stat(uint64_t *psize, time_t *pmtime, int *prval) { ::ObjectOperation *o = (::ObjectOperation *)impl; diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index 912f00d91e5..740142c48fb 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -121,8 +121,15 @@ struct ObjectOperation { osd_op.indata.append(name); osd_op.indata.append(data); } - void add_call(int op, const char *cname, const char *method, bufferlist &indata) { + void add_call(int op, const char *cname, const char *method, bufferlist &indata, + bufferlist *outbl, Context *ctx, int *prval) { OSDOp& osd_op = add_op(op); + + unsigned p = ops.size() - 1; + out_handler[p] = ctx; + out_bl[p] = outbl; + out_rval[p] = prval; + osd_op.op.op = op; osd_op.op.cls.class_len = strlen(cname); osd_op.op.cls.method_len = strlen(method); @@ -545,7 +552,12 @@ struct ObjectOperation { // object classes void call(const char *cname, const char *method, bufferlist &indata) { - add_call(CEPH_OSD_OP_CALL, cname, method, indata); + add_call(CEPH_OSD_OP_CALL, cname, method, indata, NULL, NULL, NULL); + } + + void call(const char *cname, const char *method, bufferlist &indata, bufferlist *outdata, + Context *ctx, int *prval) { + add_call(CEPH_OSD_OP_CALL, cname, method, indata, outdata, ctx, prval); } // watch/notify |