]> git.proxmox.com Git - ceph.git/blame - ceph/src/cls/statelog/cls_statelog_client.cc
update sources to v12.1.0
[ceph.git] / ceph / src / cls / statelog / cls_statelog_client.cc
CommitLineData
7c673cae
FG
1#include <errno.h>
2
31f18b77 3#include "cls/statelog/cls_statelog_client.h"
7c673cae
FG
4#include "include/rados/librados.hpp"
5
6
7using namespace librados;
8
9
10void cls_statelog_add(librados::ObjectWriteOperation& op, list<cls_statelog_entry>& entries)
11{
12 bufferlist in;
13 cls_statelog_add_op call;
14 call.entries = entries;
15 ::encode(call, in);
16 op.exec("statelog", "add", in);
17}
18
19void cls_statelog_add(librados::ObjectWriteOperation& op, cls_statelog_entry& entry)
20{
21 bufferlist in;
22 cls_statelog_add_op call;
23 call.entries.push_back(entry);
24 ::encode(call, in);
25 op.exec("statelog", "add", in);
26}
27
28void cls_statelog_add_prepare_entry(cls_statelog_entry& entry, const string& client_id, const string& op_id,
29 const string& object, const utime_t& timestamp, uint32_t state, bufferlist& bl)
30{
31 entry.client_id = client_id;
32 entry.op_id = op_id;
33 entry.object = object;
34 entry.timestamp = timestamp;
35 entry.state = state;
36 entry.data = bl;
37}
38
39void cls_statelog_add(librados::ObjectWriteOperation& op, const string& client_id, const string& op_id,
40 const string& object, const utime_t& timestamp, uint32_t state, bufferlist& bl)
41
42{
43 cls_statelog_entry entry;
44
45 cls_statelog_add_prepare_entry(entry, client_id, op_id, object, timestamp, state, bl);
46 cls_statelog_add(op, entry);
47}
48
49void cls_statelog_remove_by_client(librados::ObjectWriteOperation& op, const string& client_id, const string& op_id)
50{
51 bufferlist in;
52 cls_statelog_remove_op call;
53 call.client_id = client_id;
54 call.op_id = op_id;
55 ::encode(call, in);
56 op.exec("statelog", "remove", in);
57}
58
59void cls_statelog_remove_by_object(librados::ObjectWriteOperation& op, const string& object, const string& op_id)
60{
61 bufferlist in;
62 cls_statelog_remove_op call;
63 call.object = object;
64 call.op_id = op_id;
65 ::encode(call, in);
66 op.exec("statelog", "remove", in);
67}
68
69class StateLogListCtx : public ObjectOperationCompletion {
70 list<cls_statelog_entry> *entries;
71 string *marker;
72 bool *truncated;
73public:
74 StateLogListCtx(list<cls_statelog_entry> *_entries, string *_marker, bool *_truncated) :
75 entries(_entries), marker(_marker), truncated(_truncated) {}
76 void handle_completion(int r, bufferlist& outbl) override {
77 if (r >= 0) {
78 cls_statelog_list_ret ret;
79 try {
80 bufferlist::iterator iter = outbl.begin();
81 ::decode(ret, iter);
82 if (entries)
83 *entries = ret.entries;
84 if (truncated)
85 *truncated = ret.truncated;
86 if (marker)
87 *marker = ret.marker;
88 } catch (buffer::error& err) {
89 // nothing we can do about it atm
90 }
91 }
92 }
93};
94
95void cls_statelog_list(librados::ObjectReadOperation& op,
96 const string& client_id, const string& op_id, const string& object, /* op_id may be empty, also one of client_id, object*/
97 const string& in_marker, int max_entries, list<cls_statelog_entry>& entries,
98 string *out_marker, bool *truncated)
99{
100 bufferlist inbl;
101 cls_statelog_list_op call;
102 call.client_id = client_id;
103 call.op_id = op_id;
104 call.object = object;
105 call.marker = in_marker;
106 call.max_entries = max_entries;
107
108 ::encode(call, inbl);
109
110 op.exec("statelog", "list", inbl, new StateLogListCtx(&entries, out_marker, truncated));
111}
112
113void cls_statelog_check_state(librados::ObjectOperation& op, const string& client_id, const string& op_id, const string& object, uint32_t state)
114{
115 bufferlist inbl;
116 cls_statelog_check_state_op call;
117 call.client_id = client_id;
118 call.op_id = op_id;
119 call.object = object;
120 call.state = state;
121
122 ::encode(call, inbl);
123
124 op.exec("statelog", "check_state", inbl, NULL);
125}
126