X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fceph%2Fsrc%2Fcls%2Fstatelog%2Fcls_statelog_client.cc;fp=src%2Fceph%2Fsrc%2Fcls%2Fstatelog%2Fcls_statelog_client.cc;h=895e26a6fa5a40210098014345427f51023d93c6;hb=812ff6ca9fcd3e629e49d4328905f33eee8ca3f5;hp=0000000000000000000000000000000000000000;hpb=15280273faafb77777eab341909a3f495cf248d9;p=stor4nfv.git diff --git a/src/ceph/src/cls/statelog/cls_statelog_client.cc b/src/ceph/src/cls/statelog/cls_statelog_client.cc new file mode 100644 index 0000000..895e26a --- /dev/null +++ b/src/ceph/src/cls/statelog/cls_statelog_client.cc @@ -0,0 +1,126 @@ +#include + +#include "cls/statelog/cls_statelog_client.h" +#include "include/rados/librados.hpp" + + +using namespace librados; + + +void cls_statelog_add(librados::ObjectWriteOperation& op, list& 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, const utime_t& timestamp, uint32_t state, bufferlist& bl) +{ + entry.client_id = client_id; + entry.op_id = op_id; + entry.object = object; + entry.timestamp = timestamp; + entry.state = state; + entry.data = bl; +} + +void cls_statelog_add(librados::ObjectWriteOperation& op, const string& client_id, const string& op_id, + const string& object, const utime_t& timestamp, uint32_t state, bufferlist& bl) + +{ + cls_statelog_entry entry; + + cls_statelog_add_prepare_entry(entry, client_id, op_id, object, timestamp, 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 *entries; + string *marker; + bool *truncated; +public: + StateLogListCtx(list *_entries, string *_marker, bool *_truncated) : + entries(_entries), marker(_marker), truncated(_truncated) {} + void handle_completion(int r, bufferlist& outbl) override { + 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(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*/ + const string& in_marker, int max_entries, list& 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; + 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", "check_state", inbl, NULL); +} +