From: Jason Dillaman Date: Thu, 27 Aug 2020 13:24:49 +0000 (-0400) Subject: librados: expose msgr client addresses via API X-Git-Tag: v14.2.12~101^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=fc8ba27ea5dd9082c4bcb551c85152ec0ae196d8;p=ceph.git librados: expose msgr client addresses via API This is a partial backport of the librados API changes from commit df507cde8d71063d5873a42f668156e4c32e86f9. Signed-off-by: Jason Dillaman --- diff --git a/src/include/rados/librados.h b/src/include/rados/librados.h index d40666e45b57..3d4c80057e7c 100644 --- a/src/include/rados/librados.h +++ b/src/include/rados/librados.h @@ -3628,6 +3628,15 @@ CEPH_RADOS_API int rados_blacklist_add(rados_t cluster, char *client_address, uint32_t expire_seconds); +/** + * Gets addresses of the RADOS session, suitable for blacklisting. + * + * @param cluster cluster handle + * @param addrs the output string. + * @returns 0 on success, negative error code on failure + */ +CEPH_RADOS_API int rados_getaddrs(rados_t cluster, char** addrs); + CEPH_RADOS_API void rados_set_osdmap_full_try(rados_ioctx_t io); CEPH_RADOS_API void rados_unset_osdmap_full_try(rados_ioctx_t io); diff --git a/src/librados/RadosClient.cc b/src/librados/RadosClient.cc index 902c2c66fbfb..0ee2985ed3f2 100644 --- a/src/librados/RadosClient.cc +++ b/src/librados/RadosClient.cc @@ -821,6 +821,12 @@ void librados::RadosClient::blacklist_self(bool set) { objecter->blacklist_self(set); } +std::string librados::RadosClient::get_addrs() const { + CachedStackStringStream cos; + *cos << messenger->get_myaddrs(); + return std::string(cos->strv()); +} + int librados::RadosClient::blacklist_add(const string& client_address, uint32_t expire_seconds) { diff --git a/src/librados/RadosClient.h b/src/librados/RadosClient.h index 54eb3f9faf69..4bfa2e6c4b1b 100644 --- a/src/librados/RadosClient.h +++ b/src/librados/RadosClient.h @@ -165,6 +165,8 @@ public: bool put(); void blacklist_self(bool set); + std::string get_addrs() const; + int service_daemon_register( const std::string& service, ///< service name (e.g., 'rgw') const std::string& name, ///< daemon name (e.g., 'gwfoo') diff --git a/src/librados/librados_c.cc b/src/librados/librados_c.cc index f8b976d25765..5972fea54494 100644 --- a/src/librados/librados_c.cc +++ b/src/librados/librados_c.cc @@ -442,6 +442,15 @@ extern "C" int _rados_blacklist_add(rados_t cluster, char *client_address, } LIBRADOS_C_API_BASE_DEFAULT(rados_blacklist_add); +extern "C" int _rados_getaddrs(rados_t cluster, char** addrs) +{ + librados::RadosClient *radosp = (librados::RadosClient *)cluster; + auto s = radosp->get_addrs(); + *addrs = strdup(s.c_str()); + return 0; +} +LIBRADOS_C_API_BASE_DEFAULT(rados_getaddrs); + extern "C" void _rados_set_osdmap_full_try(rados_ioctx_t io) { librados::IoCtxImpl *ctx = (librados::IoCtxImpl *)io; diff --git a/src/pybind/rados/rados.pyx b/src/pybind/rados/rados.pyx index d08bd0ac0cb3..cfead7576775 100644 --- a/src/pybind/rados/rados.pyx +++ b/src/pybind/rados/rados.pyx @@ -150,6 +150,7 @@ cdef extern from "rados/librados.h" nogil: int rados_cluster_stat(rados_t cluster, rados_cluster_stat_t *result) int rados_cluster_fsid(rados_t cluster, char *buf, size_t len) int rados_blacklist_add(rados_t cluster, char *client_address, uint32_t expire_seconds) + int rados_getaddrs(rados_t cluster, char** addrs) int rados_application_enable(rados_ioctx_t io, const char *app_name, int force) void rados_set_osdmap_full_try(rados_ioctx_t io) @@ -678,6 +679,26 @@ cdef class Rados(object): for key, value in conf.items(): self.conf_set(key, value) + def get_addrs(self): + """ + Get associated client addresses with this RADOS session. + """ + self.require_state("configuring", "connected") + + cdef: + char* addrs = NULL + + try: + + with nogil: + ret = rados_getaddrs(self.cluster, &addrs) + if ret: + raise make_ex(ret, "error calling getaddrs") + + return decode_cstr(addrs) + finally: + free(addrs) + def require_state(self, *args): """ Checks if the Rados object is in a special state