summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@inktank.com>2013-02-28 16:08:30 -0800
committerYehuda Sadeh <yehuda@inktank.com>2013-03-22 11:23:58 -0700
commite40b76b49d64ab8ceb799760689f4375b5405fd7 (patch)
tree949de92d825df158f8c6601f6225e5bc46857693
parent0ef98d4afe05e9d429d08d5083868f91c6c37f5f (diff)
downloadceph-e40b76b49d64ab8ceb799760689f4375b5405fd7.tar.gz
cls_version: add cls_version_read(ObjectReadOpeation&)
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
-rw-r--r--src/cls/version/cls_version_client.cc25
-rw-r--r--src/cls/version/cls_version_client.h2
-rw-r--r--src/test/cls_version/test_cls_version.cc11
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;
}