Fix some bugs when testing opensds ansible
[stor4nfv.git] / src / ceph / src / cls / version / cls_version_client.cc
1 #include <errno.h>
2
3 #include "cls/version/cls_version_client.h"
4 #include "include/rados/librados.hpp"
5
6
7 using namespace librados;
8
9
10 void cls_version_set(librados::ObjectWriteOperation& op, obj_version& objv)
11 {
12   bufferlist in;
13   cls_version_set_op call;
14   call.objv = objv;
15   ::encode(call, in);
16   op.exec("version", "set", in);
17 }
18
19 void cls_version_inc(librados::ObjectWriteOperation& op)
20 {
21   bufferlist in;
22   cls_version_inc_op call;
23   ::encode(call, in);
24   op.exec("version", "inc", in);
25 }
26
27 void cls_version_inc(librados::ObjectWriteOperation& op, obj_version& objv, VersionCond cond)
28 {
29   bufferlist in;
30   cls_version_inc_op call;
31   call.objv = objv;
32   
33   obj_version_cond c;
34   c.cond = cond;
35   c.ver = objv;
36
37   call.conds.push_back(c);
38
39   ::encode(call, in);
40   op.exec("version", "inc_conds", in);
41 }
42
43 void cls_version_check(librados::ObjectOperation& op, obj_version& objv, VersionCond cond)
44 {
45   bufferlist in;
46   cls_version_check_op call;
47   call.objv = objv;
48
49   obj_version_cond c;
50   c.cond = cond;
51   c.ver = objv;
52
53   call.conds.push_back(c);
54
55   ::encode(call, in);
56   op.exec("version", "check_conds", in);
57 }
58
59 class VersionReadCtx : public ObjectOperationCompletion {
60   obj_version *objv;
61 public:
62   explicit VersionReadCtx(obj_version *_objv) : objv(_objv) {}
63   void handle_completion(int r, bufferlist& outbl) override {
64     if (r >= 0) {
65       cls_version_read_ret ret;
66       try {
67         bufferlist::iterator iter = outbl.begin();
68         ::decode(ret, iter);
69         *objv = ret.objv;
70       } catch (buffer::error& err) {
71         // nothing we can do about it atm
72       }
73     }
74   }
75 };
76
77 void cls_version_read(librados::ObjectReadOperation& op, obj_version *objv)
78 {
79   bufferlist inbl;
80   op.exec("version", "read", inbl, new VersionReadCtx(objv));
81 }
82
83 int cls_version_read(librados::IoCtx& io_ctx, string& oid, obj_version *ver)
84 {
85   bufferlist in, out;
86   int r = io_ctx.exec(oid, "version", "read", in, out);
87   if (r < 0)
88     return r;
89
90   cls_version_read_ret ret;
91   try {
92     bufferlist::iterator iter = out.begin();
93     ::decode(ret, iter);
94   } catch (buffer::error& err) {
95     return -EIO;
96   }
97
98   *ver = ret.objv;
99
100   return r;
101 }