/* * This is an example RADOS object class built using only the Ceph SDK interface. */ #include "include/rados/objclass.h" CLS_VER(1,0) CLS_NAME(sdk) cls_handle_t h_class; cls_method_handle_t h_test_coverage_write; cls_method_handle_t h_test_coverage_replay; /** * test_coverage_write - a "write" method that creates an object * * This method modifies the object by making multiple write calls (write, * setxattr and set_val). */ static int test_coverage_write(cls_method_context_t hctx, bufferlist *in, bufferlist *out) { // create the object int ret = cls_cxx_create(hctx, false); if (ret < 0) { CLS_LOG(0, "ERROR: %s(): cls_cxx_create returned %d", __func__, ret); return ret; } uint64_t size; // get the size of the object ret = cls_cxx_stat(hctx, &size, NULL); if (ret < 0) return ret; std::string c = "test"; bufferlist bl; bl.append(c); // write to the object ret = cls_cxx_write(hctx, 0, bl.length(), &bl); if (ret < 0) return ret; uint64_t new_size; // get the new size of the object ret = cls_cxx_stat(hctx, &new_size, NULL); if (ret < 0) return ret; // make some change to the xattr ret = cls_cxx_setxattr(hctx, "foo", &bl); if (ret < 0) return ret; // make some change to the omap ret = cls_cxx_map_set_val(hctx, "foo", &bl); if (ret < 0) return ret; return 0; } /** * test_coverage_replay - a "read" method to retrieve previously written data * * This method reads the object by making multiple read calls (read, getxattr * and get_val). It also removes the object after reading. */ static int test_coverage_replay(cls_method_context_t hctx, bufferlist *in, bufferlist *out) { CLS_LOG(0, "reading already written object"); uint64_t size; // get the size of the object int ret = cls_cxx_stat(hctx, &size, NULL); if (ret < 0) return ret; bufferlist bl; // read the object entry ret = cls_cxx_read(hctx, 0, size, &bl); if (ret < 0) return ret; // if the size is incorrect if (bl.length() != size) return -EIO; bl.clear(); // read xattr entry ret = cls_cxx_getxattr(hctx, "foo", &bl); if (ret < 0) return ret; // if the size is incorrect if (bl.length() != size) return -EIO; bl.clear(); // read omap entry ret = cls_cxx_map_get_val(hctx, "foo", &bl); if (ret < 0) return ret; // if the size is incorrect if (bl.length() != size) return -EIO; // remove the object ret = cls_cxx_remove(hctx); if (ret < 0) return ret; return 0; } void __cls_init() { CLS_LOG(0, "loading cls_sdk"); cls_register("sdk", &h_class); cls_register_cxx_method(h_class, "test_coverage_write", CLS_METHOD_RD|CLS_METHOD_WR, test_coverage_write, &h_test_coverage_write); cls_register_cxx_method(h_class, "test_coverage_replay", CLS_METHOD_RD|CLS_METHOD_WR, test_coverage_replay, &h_test_coverage_replay); }