From 53463d592d16156514d5d7e742c523f33e3d9207 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Wed, 20 Jun 2018 14:16:03 -0400 Subject: [PATCH] librados: add namespace getter to IoCtx API Signed-off-by: Jason Dillaman --- src/include/rados/librados.h | 12 ++++++++++++ src/include/rados/librados.hpp | 1 + src/librados/librados.cc | 21 +++++++++++++++++++++ src/test/librados/list.cc | 6 ++++++ src/tracing/librados.tp | 20 ++++++++++++++++++++ 5 files changed, 60 insertions(+) diff --git a/src/include/rados/librados.h b/src/include/rados/librados.h index ac4a1b1bfce..03ad017464d 100644 --- a/src/include/rados/librados.h +++ b/src/include/rados/librados.h @@ -998,6 +998,18 @@ CEPH_RADOS_API void rados_ioctx_locator_set_key(rados_ioctx_t io, */ CEPH_RADOS_API void rados_ioctx_set_namespace(rados_ioctx_t io, const char *nspace); + +/** + * Get the namespace for objects within the io context + * + * @param io the io context to query + * @param buf pointer to buffer where name will be stored + * @param maxlen size of buffer where name will be stored + * @returns length of string stored, or -ERANGE if buffer too small + */ +CEPH_RADOS_API int rados_ioctx_get_namespace(rados_ioctx_t io, char *buf, + unsigned maxlen); + /** @} obj_loc */ /** diff --git a/src/include/rados/librados.hpp b/src/include/rados/librados.hpp index a7aad81c9e4..85257dde4f8 100644 --- a/src/include/rados/librados.hpp +++ b/src/include/rados/librados.hpp @@ -1242,6 +1242,7 @@ namespace librados void locator_set_key(const std::string& key); void set_namespace(const std::string& nspace); + std::string get_namespace() const; int64_t get_id(); diff --git a/src/librados/librados.cc b/src/librados/librados.cc index 08c4379c4a6..4b1432632df 100644 --- a/src/librados/librados.cc +++ b/src/librados/librados.cc @@ -2215,6 +2215,11 @@ void librados::IoCtx::set_namespace(const string& nspace) io_ctx_impl->oloc.nspace = nspace; } +std::string librados::IoCtx::get_namespace() const +{ + return io_ctx_impl->oloc.nspace; +} + int64_t librados::IoCtx::get_id() { return io_ctx_impl->get_id(); @@ -4033,6 +4038,22 @@ extern "C" void rados_ioctx_set_namespace(rados_ioctx_t io, const char *nspace) tracepoint(librados, rados_ioctx_set_namespace_exit); } +extern "C" int rados_ioctx_get_namespace(rados_ioctx_t io, char *s, + unsigned maxlen) +{ + tracepoint(librados, rados_ioctx_get_namespace_enter, io, maxlen); + librados::IoCtxImpl *ctx = (librados::IoCtxImpl *)io; + auto length = ctx->oloc.nspace.length(); + if (length >= maxlen) { + tracepoint(librados, rados_ioctx_get_namespace_exit, -ERANGE, ""); + return -ERANGE; + } + strcpy(s, ctx->oloc.nspace.c_str()); + int retval = (int)length; + tracepoint(librados, rados_ioctx_get_namespace_exit, retval, s); + return retval; +} + extern "C" rados_t rados_ioctx_get_cluster(rados_ioctx_t io) { tracepoint(librados, rados_ioctx_get_cluster_enter, io); diff --git a/src/test/librados/list.cc b/src/test/librados/list.cc index 74000ac2da5..097bab5d532 100644 --- a/src/test/librados/list.cc +++ b/src/test/librados/list.cc @@ -183,6 +183,11 @@ TEST_F(LibRadosList, ListObjectsNS) { ASSERT_EQ(0, rados_write(ioctx, "foo6", buf, sizeof(buf), 0)); ASSERT_EQ(0, rados_write(ioctx, "foo7", buf, sizeof(buf), 0)); + char nspace[4]; + ASSERT_EQ(-ERANGE, rados_ioctx_get_namespace(ioctx, nspace, 3)); + ASSERT_EQ(0, rados_ioctx_get_namespace(ioctx, nspace, sizeof(nspace))); + ASSERT_EQ(0, strcmp("ns2", nspace)); + std::set def, ns1, ns2, all; def.insert(std::string("foo1")); def.insert(std::string("foo2")); @@ -271,6 +276,7 @@ TEST_F(LibRadosListPP, ListObjectsPPNS) { ioctx.set_namespace("ns2"); ASSERT_EQ(0, ioctx.write("foo6", bl1, sizeof(buf), 0)); ASSERT_EQ(0, ioctx.write("foo7", bl1, sizeof(buf), 0)); + ASSERT_EQ(std::string("ns2"), ioctx.get_namespace()); std::set def, ns1, ns2, all; def.insert(std::string("foo1")); diff --git a/src/tracing/librados.tp b/src/tracing/librados.tp index f84e078a809..98462ce0483 100644 --- a/src/tracing/librados.tp +++ b/src/tracing/librados.tp @@ -1263,6 +1263,26 @@ TRACEPOINT_EVENT(librados, rados_ioctx_set_namespace_exit, TP_FIELDS() ) +TRACEPOINT_EVENT(librados, rados_ioctx_get_namespace_enter, + TP_ARGS( + rados_ioctx_t, ioctx, + unsigned, maxlen), + TP_FIELDS( + ctf_integer_hex(rados_ioctx_t, ioctx, ioctx) + ctf_integer(unsigned, maxlen, maxlen) + ) +) + +TRACEPOINT_EVENT(librados, rados_ioctx_get_namespace_exit, + TP_ARGS( + int, retval, + const char*, name), + TP_FIELDS( + ctf_integer(int, retval, retval) + ctf_string(name, name) + ) +) + TRACEPOINT_EVENT(librados, rados_ioctx_get_cluster_enter, TP_ARGS( rados_ioctx_t, ioctx), -- 2.39.5