]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
librados: allow passing flags to operate sync APIs
authorYuval Lifshitz <yuvalif@yahoo.com>
Tue, 25 Feb 2020 15:02:29 +0000 (17:02 +0200)
committerYuval Lifshitz <yuvalif@yahoo.com>
Tue, 25 Feb 2020 15:02:29 +0000 (17:02 +0200)
this would allow returning values from sync write operations
by passing the RETURNVEC flag to the sync versions of the APIs

Signed-off-by: Yuval Lifshitz <yuvalif@yahoo.com>
src/include/rados/librados.hpp
src/librados/librados_cxx.cc
src/test/cls_hello/test_cls_hello.cc

index ca520f510c65861f92673622d403a7e622aebc18..53aa31925d614d72b4ab9760f963bfb2ee53bd56 100644 (file)
@@ -1131,7 +1131,9 @@ inline namespace v14_2_0 {
 
     // compound object operations
     int operate(const std::string& oid, ObjectWriteOperation *op);
+    int operate(const std::string& oid, ObjectWriteOperation *op, int flags);
     int operate(const std::string& oid, ObjectReadOperation *op, bufferlist *pbl);
+    int operate(const std::string& oid, ObjectReadOperation *op, bufferlist *pbl, int flags);
     int aio_operate(const std::string& oid, AioCompletion *c, ObjectWriteOperation *op);
     int aio_operate(const std::string& oid, AioCompletion *c, ObjectWriteOperation *op, int flags);
     /**
index 3ce889ce3f44705cbb9de7398d85e8802951a295..3702350984ae3a9bd2090cb3c1863bbb0454814e 100644 (file)
@@ -1513,6 +1513,14 @@ int librados::IoCtx::operate(const std::string& oid, librados::ObjectWriteOperat
   return io_ctx_impl->operate(obj, &o->impl->o, (ceph::real_time *)o->impl->prt);
 }
 
+int librados::IoCtx::operate(const std::string& oid, librados::ObjectWriteOperation *o, int flags)
+{
+  object_t obj(oid);
+  if (unlikely(!o->impl))
+    return -EINVAL;
+  return io_ctx_impl->operate(obj, &o->impl->o, (ceph::real_time *)o->impl->prt, translate_flags(flags));
+}
+
 int librados::IoCtx::operate(const std::string& oid, librados::ObjectReadOperation *o, bufferlist *pbl)
 {
   object_t obj(oid);
@@ -1521,6 +1529,14 @@ int librados::IoCtx::operate(const std::string& oid, librados::ObjectReadOperati
   return io_ctx_impl->operate_read(obj, &o->impl->o, pbl);
 }
 
+int librados::IoCtx::operate(const std::string& oid, librados::ObjectReadOperation *o, bufferlist *pbl, int flags)
+{
+  object_t obj(oid);
+  if (unlikely(!o->impl))
+    return -EINVAL;
+  return io_ctx_impl->operate_read(obj, &o->impl->o, pbl, translate_flags(flags));
+}
+
 int librados::IoCtx::aio_operate(const std::string& oid, AioCompletion *c,
                                 librados::ObjectWriteOperation *o)
 {
index b5413c89ac79e5ec985d3da0dbfa00dc6ff2ee65..355d7d244ca87fac717f09b2227fb663a15450f4 100644 (file)
@@ -132,19 +132,35 @@ TEST(ClsHello, WriteReturnData) {
   ASSERT_EQ(-ENOENT, ioctx.getxattr("myobject2", "foo", out));
 
   // this *will* return data due to the RETURNVEC flag
-  in.clear();
-  out.clear();
-  int rval;
-  ObjectWriteOperation o;
-  o.exec("hello", "write_return_data", in, &out, &rval);
-  librados::AioCompletion *completion = cluster.aio_create_completion();
-  ASSERT_EQ(0, ioctx.aio_operate("foo", completion, &o,
+  // using a-sync call
+  {
+    in.clear();
+    out.clear();
+    int rval;
+    ObjectWriteOperation o;
+    o.exec("hello", "write_return_data", in, &out, &rval);
+    librados::AioCompletion *completion = cluster.aio_create_completion();
+    ASSERT_EQ(0, ioctx.aio_operate("foo", completion, &o,
                                 librados::OPERATION_RETURNVEC));
-  completion->wait_for_complete();
-  ASSERT_EQ(42, completion->get_return_value());
-  ASSERT_EQ(42, rval);
-  out.hexdump(std::cout);
-  ASSERT_EQ("you might see this", std::string(out.c_str(), out.length()));
+    completion->wait_for_complete();
+    ASSERT_EQ(42, completion->get_return_value());
+    ASSERT_EQ(42, rval);
+    out.hexdump(std::cout);
+    ASSERT_EQ("you might see this", std::string(out.c_str(), out.length()));
+  }
+  // using sync call
+  {
+    in.clear();
+    out.clear();
+    int rval;
+    ObjectWriteOperation o;
+    o.exec("hello", "write_return_data", in, &out, &rval);
+    ASSERT_EQ(42, ioctx.operate("foo", &o,
+                                librados::OPERATION_RETURNVEC));
+    ASSERT_EQ(42, rval);
+    out.hexdump(std::cout);
+    ASSERT_EQ("you might see this", std::string(out.c_str(), out.length()));
+  }
 
   // this will overflow because the return data is too big
   {