]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librados: export stat2 in C API
authorWei Wang <lightmelodies@outlook.com>
Thu, 23 Jun 2022 00:05:02 +0000 (00:05 +0000)
committerWei Wang <lightmelodies@outlook.com>
Fri, 24 Jun 2022 23:45:15 +0000 (23:45 +0000)
Signed-off-by: Wei Wang <lightmelodies@outlook.com>
src/include/rados/librados.h
src/include/radosstriper/libradosstriper.h
src/librados/librados_c.cc
src/libradosstriper/libradosstriper.cc
src/test/librados/c_read_operations.cc
src/test/libradosstriper/io.cc
src/tracing/librados.tp

index 8d130ba7c37738d6bdf55e2392a63cc2c20b3026..409963dc390ea2523086d1535c046f03af289aa2 100644 (file)
@@ -1825,6 +1825,10 @@ CEPH_RADOS_API void rados_omap_get_end(rados_omap_iter_t iter);
  */
 CEPH_RADOS_API int rados_stat(rados_ioctx_t io, const char *o, uint64_t *psize,
                               time_t *pmtime);
+
+CEPH_RADOS_API int rados_stat2(rados_ioctx_t io, const char *o, uint64_t *psize,
+                              struct timespec *pmtime);
+
 /**
  * Execute an OSD class method on an object
  *
@@ -2210,6 +2214,10 @@ CEPH_RADOS_API int rados_aio_stat(rados_ioctx_t io, const char *o,
                                  rados_completion_t completion,
                                  uint64_t *psize, time_t *pmtime);
 
+CEPH_RADOS_API int rados_aio_stat2(rados_ioctx_t io, const char *o,
+                                 rados_completion_t completion,
+                                 uint64_t *psize, struct timespec *pmtime);
+
 /**
  * Asynchronously compare an on-disk object range with a buffer
  *
@@ -3367,6 +3375,10 @@ CEPH_RADOS_API void rados_read_op_stat(rados_read_op_t read_op,
                                       time_t *pmtime,
                                       int *prval);
 
+CEPH_RADOS_API void rados_read_op_stat2(rados_read_op_t read_op,
+                                      uint64_t *psize,
+                                      struct timespec *pmtime,
+                                      int *prval);
 /**
  * Read bytes from offset into buffer.
  *
index 7eb33596c43430365b229550c14360494187ec0a..a35345f7d185a4fb69195f0aa63814a7968a6a7e 100644 (file)
@@ -324,6 +324,11 @@ int rados_striper_stat(rados_striper_t striper,
                        uint64_t *psize,
                        time_t *pmtime);
 
+int rados_striper_stat2(rados_striper_t striper,
+                       const char* soid,
+                       uint64_t *psize,
+                       struct timespec *pmtime);
+
 /**
  * @defgroup libradosstriper_h_asynch_io Asynchronous I/O
  * Read and write to objects without blocking.
@@ -601,6 +606,11 @@ int rados_striper_aio_stat(rados_striper_t striper,
                            uint64_t *psize,
                            time_t *pmtime);
 
+int rados_striper_aio_stat2(rados_striper_t striper,
+                           const char* soid,
+                           rados_completion_t completion,
+                           uint64_t *psize,
+                           struct timespec *pmtime);
 /** @} Asynchronous I/O */
 
 #ifdef __cplusplus
index ee516d8ff668187c65516a344e4852970a3b16c5..7bde00b5fb40853edffcbd4c112d55bac155a3bf 100644 (file)
@@ -2108,6 +2108,21 @@ extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_stat)(
 }
 LIBRADOS_C_API_BASE_DEFAULT(rados_stat);
 
+extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_stat2)(
+  rados_ioctx_t io,
+  const char *o,
+  uint64_t *psize,
+  struct timespec *pmtime)
+{
+  tracepoint(librados, rados_stat2_enter, io, o);
+  librados::IoCtxImpl *ctx = (librados::IoCtxImpl *)io;
+  object_t oid(o);
+  int retval = ctx->stat2(oid, psize, pmtime);
+  tracepoint(librados, rados_stat2_exit, retval, psize, pmtime);
+  return retval;
+}
+LIBRADOS_C_API_BASE_DEFAULT(rados_stat2);
+
 extern "C" int LIBRADOS_C_API_BASE_F(rados_tmap_update)(
   rados_ioctx_t io,
   const char *o,
@@ -2992,6 +3007,21 @@ extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_stat)(
 }
 LIBRADOS_C_API_BASE_DEFAULT(rados_aio_stat);
 
+extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_stat2)(
+  rados_ioctx_t io, const char *o,
+  rados_completion_t completion,
+  uint64_t *psize, struct timespec *pmtime)
+{
+  tracepoint(librados, rados_aio_stat2_enter, io, o, completion);
+  librados::IoCtxImpl *ctx = (librados::IoCtxImpl *)io;
+  object_t oid(o);
+  int retval = ctx->aio_stat2(oid, (librados::AioCompletionImpl*)completion,
+                      psize, pmtime);
+  tracepoint(librados, rados_aio_stat2_exit, retval);
+  return retval;
+}
+LIBRADOS_C_API_BASE_DEFAULT(rados_aio_stat2);
+
 extern "C" int LIBRADOS_C_API_DEFAULT_F(rados_aio_cmpext)(
   rados_ioctx_t io, const char *o,
   rados_completion_t completion, const char *cmp_buf,
@@ -4144,6 +4174,18 @@ extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_read_op_stat)(
 }
 LIBRADOS_C_API_BASE_DEFAULT(rados_read_op_stat);
 
+extern "C" void LIBRADOS_C_API_DEFAULT_F(rados_read_op_stat2)(
+  rados_read_op_t read_op,
+  uint64_t *psize,
+  struct timespec *pmtime,
+  int *prval)
+{
+  tracepoint(librados, rados_read_op_stat2_enter, read_op, psize, pmtime, prval);
+  ((::ObjectOperation *)read_op)->stat(psize, pmtime, prval);
+  tracepoint(librados, rados_read_op_stat2_exit);
+}
+LIBRADOS_C_API_BASE_DEFAULT(rados_read_op_stat2);
+
 class C_bl_to_buf : public Context {
   char *out_buf;
   size_t out_len;
index e98dfc17935aea28bac3263a00a4a97774cce02e..86bb4d9d4acb190e41c5056021b4cdfa8c323204 100644 (file)
@@ -532,6 +532,15 @@ extern "C" int rados_striper_stat(rados_striper_t striper,
   return impl->stat(soid, psize, pmtime);
 }
 
+extern "C" int rados_striper_stat2(rados_striper_t striper,
+                                 const char* soid,
+                                 uint64_t *psize,
+                                 struct timespec *pmtime)
+{
+  libradosstriper::RadosStriperImpl *impl = (libradosstriper::RadosStriperImpl *)striper;
+  return impl->stat2(soid, psize, pmtime);
+}
+
 extern "C" int rados_striper_multi_aio_create_completion(void *cb_arg,
                                                         rados_callback_t cb_complete,
                                                         rados_callback_t cb_safe,
@@ -667,3 +676,13 @@ extern "C" int rados_striper_aio_stat(rados_striper_t striper,
   libradosstriper::RadosStriperImpl *impl = (libradosstriper::RadosStriperImpl *)striper;
   return impl->aio_stat(soid, (librados::AioCompletionImpl*)completion, psize, pmtime);
 }
+
+extern "C" int rados_striper_aio_stat2(rados_striper_t striper,
+                                     const char* soid,
+                                     rados_completion_t completion,
+                                     uint64_t *psize,
+                                     struct timespec *pmtime)
+{
+  libradosstriper::RadosStriperImpl *impl = (libradosstriper::RadosStriperImpl *)striper;
+  return impl->aio_stat2(soid, (librados::AioCompletionImpl*)completion, psize, pmtime);
+}
index 4b8336af70accb4eaf755d3f06ffba1b5f1079f6..c3d4c5b30143f72c510e7d13c4ed7456795a6245 100644 (file)
@@ -607,6 +607,38 @@ TEST_F(CReadOpsTest, Stat) {
   rados_release_read_op(op);
 }
 
+TEST_F(CReadOpsTest, Stat2) {
+  rados_read_op_t op = rados_create_read_op();
+  uint64_t size = 1;
+  int rval;
+  rados_read_op_stat2(op, &size, NULL, &rval);
+  EXPECT_EQ(-ENOENT, rados_read_op_operate(op, ioctx, obj, 0));
+  EXPECT_EQ(-EIO, rval);
+  EXPECT_EQ(1u, size);
+  rados_release_read_op(op);
+
+  write_object();
+
+  op = rados_create_read_op();
+  rados_read_op_stat2(op, &size, NULL, &rval);
+  EXPECT_EQ(0, rados_read_op_operate(op, ioctx, obj, 0));
+  EXPECT_EQ(0, rval);
+  EXPECT_EQ(len, size);
+  rados_release_read_op(op);
+
+  op = rados_create_read_op();
+  rados_read_op_stat2(op, NULL, NULL, NULL);
+  EXPECT_EQ(0, rados_read_op_operate(op, ioctx, obj, 0));
+  rados_release_read_op(op);
+
+  remove_object();
+
+  op = rados_create_read_op();
+  rados_read_op_stat2(op, NULL, NULL, NULL);
+  EXPECT_EQ(-ENOENT, rados_read_op_operate(op, ioctx, obj, 0));
+  rados_release_read_op(op);
+}
+
 TEST_F(CReadOpsTest, Omap) {
   char *keys[] = {(char*)"bar",
                  (char*)"foo",
index 2f931e5e00f6bb325b1128ec2de5b618e8d79e10..a651320e739f58f4f4cb374a6079e56573ff2001 100644 (file)
@@ -52,6 +52,17 @@ TEST_F(StriperTest, Stat) {
   ASSERT_EQ(-ENOENT, rados_striper_stat(striper, "nonexistent", &psize, &pmtime));
 }
 
+TEST_F(StriperTest, Stat2) {
+  uint64_t psize;
+  struct timespec pmtime;
+  char buf[128];
+  memset(buf, 0xcc, sizeof(buf));
+  ASSERT_EQ(0, rados_striper_write(striper, "Stat2", buf, sizeof(buf), 0));
+  ASSERT_EQ(0, rados_striper_stat2(striper, "Stat2", &psize, &pmtime));
+  ASSERT_EQ(psize, sizeof(buf));
+  ASSERT_EQ(-ENOENT, rados_striper_stat2(striper, "nonexistent", &psize, &pmtime));
+}
+
 TEST_F(StriperTestPP, StatPP) {
   char buf[128];
   memset(buf, 0xcc, sizeof(buf));
@@ -65,6 +76,19 @@ TEST_F(StriperTestPP, StatPP) {
   ASSERT_EQ(-ENOENT, striper.stat("nonexistent", &psize, &pmtime));
 }
 
+TEST_F(StriperTestPP, Stat2PP) {
+  char buf[128];
+  memset(buf, 0xcc, sizeof(buf));
+  bufferlist bl;
+  bl.append(buf, sizeof(buf));
+  ASSERT_EQ(0, striper.write("Stat2pp", bl, sizeof(buf), 0));
+  uint64_t psize;
+  struct timespec pmtime;
+  ASSERT_EQ(0, striper.stat2("Stat2pp", &psize, &pmtime));
+  ASSERT_EQ(psize, sizeof(buf));
+  ASSERT_EQ(-ENOENT, striper.stat2("nonexistent", &psize, &pmtime));
+}
+
 TEST_F(StriperTest, RoundTrip) {
   char buf[128];
   char buf2[sizeof(buf)];
index e6f8ade099fb7196cff4af4a5a6401eb843d9343..42559097b84232df1952f122ad8b336c03f26788 100644 (file)
@@ -1735,6 +1735,28 @@ TRACEPOINT_EVENT(librados, rados_stat_exit,
     )
 )
 
+TRACEPOINT_EVENT(librados, rados_stat2_enter,
+    TP_ARGS(
+        rados_ioctx_t, ioctx,
+        const char*, oid),
+    TP_FIELDS(
+        ctf_integer_hex(rados_ioctx_t, ioctx, ioctx)
+        ctf_string(oid, oid)
+    )
+)
+
+TRACEPOINT_EVENT(librados, rados_stat2_exit,
+    TP_ARGS(
+        int, retval,
+        uint64_t*, size,
+        struct timespec*, mtime),
+    TP_FIELDS(
+        ctf_integer(int, retval, retval)
+        ceph_ctf_integerp(uint64_t, size, size)
+        ceph_ctf_timespecp(mtime, mtime)
+    )
+)
+
 TRACEPOINT_EVENT(librados, rados_exec_enter,
     TP_ARGS(
         rados_ioctx_t, ioctx,
@@ -2507,6 +2529,26 @@ TRACEPOINT_EVENT(librados, rados_aio_stat_exit,
     )
 )
 
+TRACEPOINT_EVENT(librados, rados_aio_stat2_enter,
+    TP_ARGS(
+        rados_ioctx_t, ioctx,
+        const char*, oid,
+        rados_completion_t, completion),
+    TP_FIELDS(
+        ctf_integer_hex(rados_ioctx_t, ioctx, ioctx)
+        ctf_string(oid, oid)
+        ctf_integer_hex(rados_completion_t, completion, completion)
+    )
+)
+
+TRACEPOINT_EVENT(librados, rados_aio_stat2_exit,
+    TP_ARGS(
+        int, retval),
+    TP_FIELDS(
+        ctf_integer(int, retval, retval)
+    )
+)
+
 TRACEPOINT_EVENT(librados, rados_aio_exec_enter,
     TP_ARGS(
         rados_ioctx_t, ioctx,
@@ -3714,6 +3756,25 @@ TRACEPOINT_EVENT(librados, rados_read_op_stat_exit,
     TP_FIELDS()
 )
 
+TRACEPOINT_EVENT(librados, rados_read_op_stat2_enter,
+    TP_ARGS(
+        rados_read_op_t, read_op,
+        void*, psize,
+        void*, pmtime,
+        void*, prval),
+    TP_FIELDS(
+        ctf_integer_hex(rados_read_op_t, read_op, read_op)
+        ctf_integer_hex(void*, psize, psize)
+        ctf_integer_hex(void*, pmtime, pmtime)
+        ctf_integer_hex(void*, prval, prval)
+    )
+)
+
+TRACEPOINT_EVENT(librados, rados_read_op_stat2_exit,
+    TP_ARGS(),
+    TP_FIELDS()
+)
+
 TRACEPOINT_EVENT(librados, rados_read_op_read_enter,
     TP_ARGS(
         rados_read_op_t, read_op,