From: Wei Wang Date: Thu, 23 Jun 2022 00:05:02 +0000 (+0000) Subject: librados: export stat2 in C API X-Git-Tag: v18.0.0~86^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b0b4c91e449198a73e76f9c24d65db973d49197d;p=ceph.git librados: export stat2 in C API Signed-off-by: Wei Wang --- diff --git a/src/include/rados/librados.h b/src/include/rados/librados.h index 8d130ba7c377..409963dc390e 100644 --- a/src/include/rados/librados.h +++ b/src/include/rados/librados.h @@ -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. * diff --git a/src/include/radosstriper/libradosstriper.h b/src/include/radosstriper/libradosstriper.h index 7eb33596c434..a35345f7d185 100644 --- a/src/include/radosstriper/libradosstriper.h +++ b/src/include/radosstriper/libradosstriper.h @@ -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 diff --git a/src/librados/librados_c.cc b/src/librados/librados_c.cc index ee516d8ff668..7bde00b5fb40 100644 --- a/src/librados/librados_c.cc +++ b/src/librados/librados_c.cc @@ -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; diff --git a/src/libradosstriper/libradosstriper.cc b/src/libradosstriper/libradosstriper.cc index e98dfc17935a..86bb4d9d4acb 100644 --- a/src/libradosstriper/libradosstriper.cc +++ b/src/libradosstriper/libradosstriper.cc @@ -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); +} diff --git a/src/test/librados/c_read_operations.cc b/src/test/librados/c_read_operations.cc index 4b8336af70ac..c3d4c5b30143 100644 --- a/src/test/librados/c_read_operations.cc +++ b/src/test/librados/c_read_operations.cc @@ -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", diff --git a/src/test/libradosstriper/io.cc b/src/test/libradosstriper/io.cc index 2f931e5e00f6..a651320e739f 100644 --- a/src/test/libradosstriper/io.cc +++ b/src/test/libradosstriper/io.cc @@ -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)]; diff --git a/src/tracing/librados.tp b/src/tracing/librados.tp index e6f8ade099fb..42559097b842 100644 --- a/src/tracing/librados.tp +++ b/src/tracing/librados.tp @@ -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,