]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
librados: getter for min compatible client versions
authorJason Dillaman <dillaman@redhat.com>
Tue, 23 Jan 2018 19:35:25 +0000 (14:35 -0500)
committerJason Dillaman <dillaman@redhat.com>
Tue, 23 Jan 2018 19:35:25 +0000 (14:35 -0500)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/include/rados/librados.h
src/include/rados/librados.hpp
src/librados/RadosClient.cc
src/librados/RadosClient.h
src/librados/librados.cc
src/test/librados/misc.cc

index 452c3ac573f3531f61b8b14e12084bb4126e8b2a..8ef0836002616bcc565c0383f713e222a6cf9e9b 100644 (file)
@@ -706,6 +706,20 @@ CEPH_RADOS_API rados_config_t rados_cct(rados_t cluster);
  */
 CEPH_RADOS_API uint64_t rados_get_instance_id(rados_t cluster);
 
+/**
+ * Gets the minimum compatible client version
+ *
+ * @param cluster cluster handle
+ * @param[out] min_compat_client minimum compatible client version
+ *  based upon the current features
+ * @param[out] require_min_compat_client required minimum client version
+ *  based upon explicit setting
+ * @returns 0 on sucess, negative error code on failure
+ */
+CEPH_RADOS_API int rados_get_min_compatible_client(rados_t cluster,
+                                                   int8_t* min_compat_client,
+                                                   int8_t* require_min_compat_client);
+
 /**
  * Create an io context
  *
index cd3c5e1d60c9ff08cb35865e9dfa47d581d3fe3f..5c7befc49e4e16abc01295e9f036087926c4c441 100644 (file)
@@ -1337,6 +1337,9 @@ namespace librados
 
     uint64_t get_instance_id();
 
+    int get_min_compatible_client(int8_t* min_compat_client,
+                                  int8_t* require_min_compat_client);
+
     int mon_command(std::string cmd, const bufferlist& inbl,
                    bufferlist *outbl, std::string *outs);
     int mgr_command(std::string cmd, const bufferlist& inbl,
index 17c4bfcd7a1a655ee233e4bb73d2596b56df5390..3fcd2523daf52159105ecb9e68a3c21d0c98ebc7 100644 (file)
@@ -441,6 +441,22 @@ uint64_t librados::RadosClient::get_instance_id()
   return instance_id;
 }
 
+int librados::RadosClient::get_min_compatible_client(int8_t* min_compat_client,
+                                                     int8_t* require_min_compat_client)
+{
+  int r = wait_for_osdmap();
+  if (r < 0) {
+    return r;
+  }
+
+  objecter->with_osdmap(
+    [min_compat_client, require_min_compat_client](const OSDMap& o) {
+      *min_compat_client = o.get_min_compat_client();
+      *require_min_compat_client = o.get_require_min_compat_client();
+    });
+  return 0;
+}
+
 librados::RadosClient::~RadosClient()
 {
   if (messenger)
index 324458e07e83678e14e6b13d5db3bb2cca5c940b..66016b100613a83acc8fb5eb35ddf5b0e730eb97 100644 (file)
@@ -99,6 +99,9 @@ public:
 
   uint64_t get_instance_id();
 
+  int get_min_compatible_client(int8_t* min_compat_client,
+                                int8_t* require_min_compat_client);
+
   int wait_for_latest_osdmap();
 
   int create_ioctx(const char *name, IoCtxImpl **io);
index a0e3abe5abc858615ce32de6334075ccd875edb7..a3143973e2a3301a3b879de6140f45bf39071577 100644 (file)
@@ -2323,6 +2323,13 @@ uint64_t librados::Rados::get_instance_id()
   return client->get_instance_id();
 }
 
+int librados::Rados::get_min_compatible_client(int8_t* min_compat_client,
+                                               int8_t* require_min_compat_client)
+{
+  return client->get_min_compatible_client(min_compat_client,
+                                           require_min_compat_client);
+}
+
 int librados::Rados::conf_read_file(const char * const path) const
 {
   return rados_conf_read_file((rados_t)client, path);
@@ -2888,6 +2895,15 @@ extern "C" uint64_t rados_get_instance_id(rados_t cluster)
   return retval;
 }
 
+extern "C" int rados_get_min_compatible_client(rados_t cluster,
+                                               int8_t* min_compat_client,
+                                               int8_t* require_min_compat_client)
+{
+  librados::RadosClient *client = (librados::RadosClient *)cluster;
+  return client->get_min_compatible_client(min_compat_client,
+                                           require_min_compat_client);
+}
+
 extern "C" void rados_version(int *major, int *minor, int *extra)
 {
   tracepoint(librados, rados_version_enter, major, minor, extra);
index e3101e23c3713a726eca9c93e1c6188605c5f35d..93ac62ddca91d5d60633ae58c53a14cdbe75dd2e 100644 (file)
@@ -6,6 +6,7 @@
 #include "include/err.h"
 #include "include/buffer.h"
 #include "include/rbd_types.h"
+#include "include/rados.h"
 #include "include/rados/librados.h"
 #include "include/rados/librados.hpp"
 #include "include/stringify.h"
@@ -1379,3 +1380,28 @@ TEST_F(LibRadosMiscECPP, CompareExtentRange) {
   read2.cmpext(2097152, bl3, nullptr);
   ASSERT_EQ(0, ioctx.operate("foo", &read2, nullptr));
 }
+
+TEST_F(LibRadosMisc, MinCompatClient) {
+  int8_t min_compat_client;
+  int8_t require_min_compat_client;
+  ASSERT_EQ(0, rados_get_min_compatible_client(cluster,
+                                               &min_compat_client,
+                                               &require_min_compat_client));
+  ASSERT_LE(-1, min_compat_client);
+  ASSERT_GT(CEPH_RELEASE_MAX, min_compat_client);
+
+  ASSERT_LE(-1, require_min_compat_client);
+  ASSERT_GT(CEPH_RELEASE_MAX, require_min_compat_client);
+}
+
+TEST_F(LibRadosMiscPP, MinCompatClient) {
+  int8_t min_compat_client;
+  int8_t require_min_compat_client;
+  ASSERT_EQ(0, cluster.get_min_compatible_client(&min_compat_client,
+                                                 &require_min_compat_client));
+  ASSERT_LE(-1, min_compat_client);
+  ASSERT_GT(CEPH_RELEASE_MAX, min_compat_client);
+
+  ASSERT_LE(-1, require_min_compat_client);
+  ASSERT_GT(CEPH_RELEASE_MAX, require_min_compat_client);
+}