summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@inktank.com>2013-06-17 21:06:42 -0700
committerYehuda Sadeh <yehuda@inktank.com>2013-06-17 21:06:42 -0700
commit8d5fc708ff711dfcedd78f5700776c893ef91a38 (patch)
tree8fac8d815ca9cf68c89538ecc9e4e9910b721f49
parentfbe816a1351a36fe23aa79f2895f205cf412190b (diff)
downloadceph-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.cc127
-rw-r--r--src/cls/statelog/cls_statelog_client.h29
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