diff options
author | Yehuda Sadeh <yehuda@inktank.com> | 2013-06-17 21:06:42 -0700 |
---|---|---|
committer | Yehuda Sadeh <yehuda@inktank.com> | 2013-06-17 21:06:42 -0700 |
commit | 8d5fc708ff711dfcedd78f5700776c893ef91a38 (patch) | |
tree | 8fac8d815ca9cf68c89538ecc9e4e9910b721f49 | |
parent | fbe816a1351a36fe23aa79f2895f205cf412190b (diff) | |
download | ceph-8d5fc708ff711dfcedd78f5700776c893ef91a38.tar.gz |
cls_statelog: add client api functions
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
-rw-r--r-- | src/cls/statelog/cls_statelog_client.cc | 127 | ||||
-rw-r--r-- | src/cls/statelog/cls_statelog_client.h | 29 |
2 files changed, 156 insertions, 0 deletions
diff --git a/src/cls/statelog/cls_statelog_client.cc b/src/cls/statelog/cls_statelog_client.cc new file mode 100644 index 00000000000..9f82533956c --- /dev/null +++ b/src/cls/statelog/cls_statelog_client.cc @@ -0,0 +1,127 @@ +#include <errno.h> + +#include "include/types.h" +#include "cls/statelog/cls_statelog_ops.h" +#include "include/rados/librados.hpp" + + +using namespace librados; + + +void cls_statelog_add(librados::ObjectWriteOperation& op, list<cls_statelog_entry>& entries) +{ + bufferlist in; + cls_statelog_add_op call; + call.entries = entries; + ::encode(call, in); + op.exec("statelog", "add", in); +} + +void cls_statelog_add(librados::ObjectWriteOperation& op, cls_statelog_entry& entry) +{ + bufferlist in; + cls_statelog_add_op call; + call.entries.push_back(entry); + ::encode(call, in); + op.exec("statelog", "add", in); +} + +void cls_statelog_add_prepare_entry(cls_statelog_entry& entry, const string& client_id, const string& op_id, + const string& object, uint32_t state, bufferlist& bl) +{ + entry.client_id = client_id; + entry.op_id = op_id; + entry.object = object; + entry.state = state; + entry.data = bl; +} + +void cls_statelog_add(librados::ObjectWriteOperation& op, const string& client_id, const string& op_id, + const string& object, uint32_t state, bufferlist& bl) + +{ + cls_statelog_entry entry; + + cls_statelog_add_prepare_entry(entry, client_id, op_id, object, state, bl); + cls_statelog_add(op, entry); +} + +void cls_statelog_remove_by_client(librados::ObjectWriteOperation& op, const string& client_id, const string& op_id) +{ + bufferlist in; + cls_statelog_remove_op call; + call.client_id = client_id; + call.op_id = op_id; + ::encode(call, in); + op.exec("statelog", "remove", in); +} + +void cls_statelog_remove_by_object(librados::ObjectWriteOperation& op, const string& object, const string& op_id) +{ + bufferlist in; + cls_statelog_remove_op call; + call.object = object; + call.op_id = op_id; + ::encode(call, in); + op.exec("statelog", "remove", in); +} + +class StateLogListCtx : public ObjectOperationCompletion { + list<cls_statelog_entry> *entries; + string *marker; + bool *truncated; +public: + StateLogListCtx(list<cls_statelog_entry> *_entries, string *_marker, bool *_truncated) : + entries(_entries), marker(_marker), truncated(_truncated) {} + void handle_completion(int r, bufferlist& outbl) { + if (r >= 0) { + cls_statelog_list_ret ret; + try { + bufferlist::iterator iter = outbl.begin(); + ::decode(ret, iter); + if (entries) + *entries = ret.entries; + if (truncated) + *truncated = ret.truncated; + if (marker) + *marker = ret.marker; + } catch (buffer::error& err) { + // nothing we can do about it atm + } + } + } +}; + +void cls_statelog_list_by_client(librados::ObjectReadOperation& op, + const string& client_id, const string& op_id, const string& object, /* op_id may be empty, also one of client_id, object*/ + string& in_marker, int max_entries, list<cls_statelog_entry>& entries, + string *out_marker, bool *truncated) +{ + bufferlist inbl; + cls_statelog_list_op call; + call.client_id = client_id; + call.op_id = op_id; + call.object = object; + call.marker = in_marker; + call.max_entries = max_entries; + + ::encode(call, inbl); + + op.exec("statelog", "list", inbl, new StateLogListCtx(&entries, out_marker, truncated)); +} + +void cls_statelog_check_state(librados::ObjectOperation& op, const string& client_id, const string& op_id, const string& object, uint32_t state) +{ + bufferlist inbl; + bufferlist outbl; + cls_statelog_check_state_op call; + call.client_id = client_id; + call.op_id = op_id; + call.object = object; + call.state = state; + + ::encode(call, inbl); + + op.exec("statelog", "list", inbl, NULL); +} + diff --git a/src/cls/statelog/cls_statelog_client.h b/src/cls/statelog/cls_statelog_client.h new file mode 100644 index 00000000000..2a9c4c06bd1 --- /dev/null +++ b/src/cls/statelog/cls_statelog_client.h @@ -0,0 +1,29 @@ +#ifndef CEPH_CLS_STATELOG_CLIENT_H +#define CEPH_CLS_STATELOG_CLIENT_H + +#include "include/types.h" +#include "include/rados/librados.hpp" +#include "cls_statelog_types.h" + +/* + * log objclass + */ + +void cls_statelog_add_prepare_entry(cls_statelog_entry& entry, const string& client_id, const string& op_id, + const string& object, uint32_t state, bufferlist& bl); + +void cls_statelog_add(librados::ObjectWriteOperation& op, list<cls_statelog_entry>& entry); +void cls_statelog_add(librados::ObjectWriteOperation& op, cls_statelog_entry& entry); +void cls_statelog_add(librados::ObjectWriteOperation& op, const string& client_id, const string& op_id, + const string& object, uint32_t state, bufferlist& bl); + +void cls_statelog_list_by_client(librados::ObjectReadOperation& op, + const string& client_id, const string& op_id, const string& object, /* op_id may be empty, also one of client_id, object*/ + string& in_marker, int max_entries, list<cls_statelog_entry>& entries, + string *out_marker, bool *truncated); + +void cls_statelog_remove_by_client(librados::ObjectWriteOperation& op, const string& client_id, const string& op_id); +void cls_statelog_remove_by_object(librados::ObjectWriteOperation& op, const string& object, const string& op_id); + +void cls_statelog_check_state(librados::ObjectOperation& op, const string& client_id, const string& op_id, const string& object, uint32_t state); +#endif |