]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librados: expose msgr client addresses via API
authorJason Dillaman <dillaman@redhat.com>
Thu, 27 Aug 2020 13:24:49 +0000 (09:24 -0400)
committerJason Dillaman <dillaman@redhat.com>
Thu, 27 Aug 2020 13:24:49 +0000 (09:24 -0400)
This is a partial backport of the librados API changes from commit
df507cde8d71063d5873a42f668156e4c32e86f9.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/include/rados/librados.h
src/librados/RadosClient.cc
src/librados/RadosClient.h
src/librados/librados_c.cc
src/pybind/rados/rados.pyx

index d40666e45b570cfec306028310c422d35340f319..3d4c80057e7c62090b5f6b069c98a5f330640eeb 100644 (file)
@@ -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);
index 902c2c66fbfbfd29aa47f25f2cd6fd1566697fc0..0ee2985ed3f28fb409519ace6d2858298d89146d 100644 (file)
@@ -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)
 {
index 54eb3f9faf697b3935d92b59b5ecbc9027d29b7f..4bfa2e6c4b1b388f2b93615afd7609a7cecbf6df 100644 (file)
@@ -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')
index f8b976d25765522f7d2837859f42e06ce63e9584..5972fea5449441ee76ebf9889365a4d2661fdf7f 100644 (file)
@@ -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;
index d08bd0ac0cb3aeec5973c6385163fee5437148a2..cfead757677518f054c7d094dd9d0539aa76f111 100644 (file)
@@ -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