]> git.proxmox.com Git - ceph.git/blob - ceph/src/cls/sdk/cls_sdk.cc
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / cls / sdk / cls_sdk.cc
1 /*
2 * This is an example RADOS object class built using only the Ceph SDK interface.
3 */
4 #include "include/rados/objclass.h"
5
6 CLS_VER(1,0)
7 CLS_NAME(sdk)
8
9 cls_handle_t h_class;
10 cls_method_handle_t h_test_coverage_write;
11 cls_method_handle_t h_test_coverage_replay;
12
13 /**
14 * test_coverage_write - a "write" method that creates an object
15 *
16 * This method modifies the object by making multiple write calls (write,
17 * setxattr and set_val).
18 */
19 static int test_coverage_write(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
20 {
21 // create the object
22 int ret = cls_cxx_create(hctx, false);
23 if (ret < 0) {
24 CLS_LOG(0, "ERROR: %s(): cls_cxx_create returned %d", __func__, ret);
25 return ret;
26 }
27
28 uint64_t size;
29 // get the size of the object
30 ret = cls_cxx_stat(hctx, &size, NULL);
31 if (ret < 0)
32 return ret;
33
34 std::string c = "test";
35 bufferlist bl;
36 bl.append(c);
37
38 // write to the object
39 ret = cls_cxx_write(hctx, 0, bl.length(), &bl);
40 if (ret < 0)
41 return ret;
42
43 uint64_t new_size;
44 // get the new size of the object
45 ret = cls_cxx_stat(hctx, &new_size, NULL);
46 if (ret < 0)
47 return ret;
48
49 // make some change to the xattr
50 ret = cls_cxx_setxattr(hctx, "foo", &bl);
51 if (ret < 0)
52 return ret;
53
54 // make some change to the omap
55 ret = cls_cxx_map_set_val(hctx, "foo", &bl);
56 if (ret < 0)
57 return ret;
58
59 return 0;
60 }
61
62 /**
63 * test_coverage_replay - a "read" method to retrieve previously written data
64 *
65 * This method reads the object by making multiple read calls (read, getxattr
66 * and get_val). It also removes the object after reading.
67 */
68
69 static int test_coverage_replay(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
70 {
71 CLS_LOG(0, "reading already written object");
72 uint64_t size;
73 // get the size of the object
74 int ret = cls_cxx_stat(hctx, &size, NULL);
75 if (ret < 0)
76 return ret;
77
78 bufferlist bl;
79 // read the object entry
80 ret = cls_cxx_read(hctx, 0, size, &bl);
81 if (ret < 0)
82 return ret;
83
84 // if the size is incorrect
85 if (bl.length() != size)
86 return -EIO;
87
88 bl.clear();
89
90 // read xattr entry
91 ret = cls_cxx_getxattr(hctx, "foo", &bl);
92 if (ret < 0)
93 return ret;
94
95 // if the size is incorrect
96 if (bl.length() != size)
97 return -EIO;
98
99 bl.clear();
100
101 // read omap entry
102 ret = cls_cxx_map_get_val(hctx, "foo", &bl);
103 if (ret < 0)
104 return ret;
105
106 // if the size is incorrect
107 if (bl.length() != size)
108 return -EIO;
109
110 // remove the object
111 ret = cls_cxx_remove(hctx);
112 if (ret < 0)
113 return ret;
114
115 return 0;
116 }
117
118 void __cls_init()
119 {
120 CLS_LOG(0, "loading cls_sdk");
121
122 cls_register("sdk", &h_class);
123
124 cls_register_cxx_method(h_class, "test_coverage_write",
125 CLS_METHOD_RD|CLS_METHOD_WR,
126 test_coverage_write, &h_test_coverage_write);
127
128 cls_register_cxx_method(h_class, "test_coverage_replay",
129 CLS_METHOD_RD|CLS_METHOD_WR,
130 test_coverage_replay, &h_test_coverage_replay);
131 }