diff options
-rw-r--r-- | src/cls/version/cls_version_client.cc | 25 | ||||
-rw-r--r-- | src/cls/version/cls_version_client.h | 2 | ||||
-rw-r--r-- | src/test/cls_version/test_cls_version.cc | 11 |
3 files changed, 37 insertions, 1 deletions
diff --git a/src/cls/version/cls_version_client.cc b/src/cls/version/cls_version_client.cc index b0b81653f1f..70d5ebe6769 100644 --- a/src/cls/version/cls_version_client.cc +++ b/src/cls/version/cls_version_client.cc @@ -4,6 +4,7 @@ #include "cls/version/cls_version_ops.h" #include "include/rados/librados.hpp" + using namespace librados; @@ -56,6 +57,30 @@ void cls_version_check(librados::ObjectOperation& op, obj_version& objv, Version op.exec("version", "check_conds", in); } +class VersionReadCtx : public ObjectOperationCompletion { + obj_version *objv; +public: + VersionReadCtx(obj_version *_objv) : objv(_objv) {} + void handle_completion(int r, bufferlist& outbl) { + if (r >= 0) { + cls_version_read_ret ret; + try { + bufferlist::iterator iter = outbl.begin(); + ::decode(ret, iter); + *objv = ret.objv; + } catch (buffer::error& err) { + // nothing we can do about it atm + } + } + } +}; + +void cls_version_read(librados::ObjectReadOperation& op, obj_version *objv) +{ + bufferlist inbl; + op.exec("version", "read", inbl, new VersionReadCtx(objv)); +} + int cls_version_read(librados::IoCtx& io_ctx, string& oid, obj_version *ver) { bufferlist in, out; diff --git a/src/cls/version/cls_version_client.h b/src/cls/version/cls_version_client.h index fa2465baff4..d9e09415d52 100644 --- a/src/cls/version/cls_version_client.h +++ b/src/cls/version/cls_version_client.h @@ -16,7 +16,7 @@ void cls_version_inc(librados::ObjectWriteOperation& op); /* conditional increase, return -EAGAIN if condition fails */ void cls_version_inc(librados::ObjectWriteOperation& op, obj_version& ver, VersionCond cond); -int cls_version_read(bufferlist& outbl); +void cls_version_read(librados::ObjectReadOperation& op, obj_version *objv); int cls_version_read(librados::IoCtx& io_ctx, string& oid, obj_version *ver); diff --git a/src/test/cls_version/test_cls_version.cc b/src/test/cls_version/test_cls_version.cc index 5012957f0ae..6392424644a 100644 --- a/src/test/cls_version/test_cls_version.cc +++ b/src/test/cls_version/test_cls_version.cc @@ -66,6 +66,17 @@ TEST(cls_rgw, test_version_inc_read) ASSERT_EQ(0, (int)ver2.tag.compare(ver.tag)); delete op; + + obj_version ver3; + + librados::ObjectReadOperation *rop = new_rop(); + cls_version_read(*rop, &ver3); + bufferlist outbl; + ASSERT_EQ(0, ioctx.operate(oid, rop, &outbl)); + ASSERT_EQ(ver2.ver, ver3.ver); + ASSERT_EQ(1, (long long)ver2.compare(&ver3)); + + delete op; } |