]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librados: new get_min_compatible_osd API helper methods
authorJason Dillaman <dillaman@redhat.com>
Tue, 28 Aug 2018 19:12:10 +0000 (15:12 -0400)
committerJason Dillaman <dillaman@redhat.com>
Tue, 28 Aug 2018 19:22:39 +0000 (15:22 -0400)
These methods retrieve the current minimum required OSD version
from the OSD map. This can help client applications determine if
new features are supported by the cluster.

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
src/test/librados_test_stub/LibradosTestStub.cc
src/test/librados_test_stub/MockTestMemRadosClient.h
src/test/librados_test_stub/TestMemRadosClient.h
src/test/librados_test_stub/TestRadosClient.h

index fb9989014ed2fb4478e1804c4095958c1a9a47aa..1fa0c3f570b215bb3252170a629f7dfc376f8182 100644 (file)
@@ -709,6 +709,17 @@ 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 OSD version
+ *
+ * @param cluster cluster handle
+ * @param[out] require_osd_release minimum compatible OSD version
+ *  based upon the current features
+ * @returns 0 on sucess, negative error code on failure
+ */
+CEPH_RADOS_API int rados_get_min_compatible_osd(rados_t cluster,
+                                                int8_t* require_osd_release);
+
 /**
  * Gets the minimum compatible client version
  *
index 3355e0c4c034bfc02dd06aeb0794d67afdc77aa0..da92883e556bf163ef979dfb31e18d85dbb21087 100644 (file)
@@ -1343,6 +1343,7 @@ namespace librados
 
     uint64_t get_instance_id();
 
+    int get_min_compatible_osd(int8_t* require_osd_release);
     int get_min_compatible_client(int8_t* min_compat_client,
                                   int8_t* require_min_compat_client);
 
index 58c24c42f25c18c5336925479abd145e0e1cdc9a..d99831fc397c0e02cefa425b75cf16cc48bfd682 100644 (file)
@@ -462,6 +462,20 @@ uint64_t librados::RadosClient::get_instance_id()
   return instance_id;
 }
 
+int librados::RadosClient::get_min_compatible_osd(int8_t* require_osd_release)
+{
+  int r = wait_for_osdmap();
+  if (r < 0) {
+    return r;
+  }
+
+  objecter->with_osdmap(
+    [require_osd_release](const OSDMap& o) {
+      *require_osd_release = o.require_osd_release;
+    });
+  return 0;
+}
+
 int librados::RadosClient::get_min_compatible_client(int8_t* min_compat_client,
                                                      int8_t* require_min_compat_client)
 {
index 676b9e6e95a4a72f8aac934860a6eebc5d7eca04..d900a23de1472b900ff7d18afefaa4e02cddb044 100644 (file)
@@ -99,6 +99,7 @@ public:
 
   uint64_t get_instance_id();
 
+  int get_min_compatible_osd(int8_t* require_osd_release);
   int get_min_compatible_client(int8_t* min_compat_client,
                                 int8_t* require_min_compat_client);
 
index 33ee1ba2c60087670416a8979bbb76e8b978893d..5072e59f8919c70a17313296fe785fbb8c2de846 100644 (file)
@@ -2353,6 +2353,11 @@ uint64_t librados::Rados::get_instance_id()
   return client->get_instance_id();
 }
 
+int librados::Rados::get_min_compatible_osd(int8_t* require_osd_release)
+{
+  return client->get_min_compatible_osd(require_osd_release);
+}
+
 int librados::Rados::get_min_compatible_client(int8_t* min_compat_client,
                                                int8_t* require_min_compat_client)
 {
@@ -2925,6 +2930,13 @@ extern "C" uint64_t rados_get_instance_id(rados_t cluster)
   return retval;
 }
 
+extern "C" int rados_get_min_compatible_osd(rados_t cluster,
+                                            int8_t* require_osd_release)
+{
+  librados::RadosClient *client = (librados::RadosClient *)cluster;
+  return client->get_min_compatible_osd(require_osd_release);
+}
+
 extern "C" int rados_get_min_compatible_client(rados_t cluster,
                                                int8_t* min_compat_client,
                                                int8_t* require_min_compat_client)
index aa6f7691052765282583ad846c106ded3e033747..50f87186566560fe8cc599e5cbbe9653c649ce96 100644 (file)
@@ -1378,6 +1378,20 @@ TEST_F(LibRadosMiscECPP, CompareExtentRange) {
   ASSERT_EQ(0, ioctx.operate("foo", &read2, nullptr));
 }
 
+TEST_F(LibRadosMisc, MinCompatOSD) {
+  int8_t require_osd_release;
+  ASSERT_EQ(0, rados_get_min_compatible_osd(cluster, &require_osd_release));
+  ASSERT_LE(-1, require_osd_release);
+  ASSERT_GT(CEPH_RELEASE_MAX, require_osd_release);
+}
+
+TEST_F(LibRadosMiscPP, MinCompatOSD) {
+  int8_t require_osd_release;
+  ASSERT_EQ(0, cluster.get_min_compatible_osd(&require_osd_release));
+  ASSERT_LE(-1, require_osd_release);
+  ASSERT_GT(CEPH_RELEASE_MAX, require_osd_release);
+}
+
 TEST_F(LibRadosMisc, MinCompatClient) {
   int8_t min_compat_client;
   int8_t require_min_compat_client;
index 38a948a8571204b3d7eb5713a3c136826aba4b7d..9066c1b54143874f09e90b3630b27db267232c78 100644 (file)
@@ -1020,6 +1020,11 @@ uint64_t Rados::get_instance_id() {
   return impl->get_instance_id();
 }
 
+int Rados::get_min_compatible_osd(int8_t* require_osd_release) {
+  TestRadosClient *impl = reinterpret_cast<TestRadosClient*>(client);
+  return impl->get_min_compatible_osd(require_osd_release);
+}
+
 int Rados::get_min_compatible_client(int8_t* min_compat_client,
                                      int8_t* require_min_compat_client) {
   TestRadosClient *impl = reinterpret_cast<TestRadosClient*>(client);
index 1f44c499ded576038983c52406f76da50d04401f..c22845c1da8a83181fa9ddddebe680736cba7924 100644 (file)
@@ -35,6 +35,11 @@ public:
     return TestMemRadosClient::blacklist_add(client_address, expire_seconds);
   }
 
+  MOCK_METHOD1(get_min_compatible_osd, int(int8_t*));
+  int do_get_min_compatible_osd(int8_t* require_osd_release) {
+    return TestMemRadosClient::get_min_compatible_osd(require_osd_release);
+  }
+
   MOCK_METHOD2(get_min_compatible_client, int(int8_t*, int8_t*));
   int do_get_min_compatible_client(int8_t* min_compat_client,
                                    int8_t* require_min_compat_client) {
@@ -65,6 +70,7 @@ public:
 
     ON_CALL(*this, create_ioctx(_, _)).WillByDefault(Invoke(this, &MockTestMemRadosClient::do_create_ioctx));
     ON_CALL(*this, blacklist_add(_, _)).WillByDefault(Invoke(this, &MockTestMemRadosClient::do_blacklist_add));
+    ON_CALL(*this, get_min_compatible_osd(_)).WillByDefault(Invoke(this, &MockTestMemRadosClient::do_get_min_compatible_osd));
     ON_CALL(*this, get_min_compatible_client(_, _)).WillByDefault(Invoke(this, &MockTestMemRadosClient::do_get_min_compatible_client));
     ON_CALL(*this, service_daemon_register(_, _, _)).WillByDefault(Invoke(this, &MockTestMemRadosClient::do_service_daemon_register));
     ON_CALL(*this, service_daemon_update_status_r(_)).WillByDefault(Invoke(this, &MockTestMemRadosClient::do_service_daemon_update_status_r));
index f11c69affe83617815a4d29a5e61af5fa8ec672b..164b65c85a5f0b9dcd1a9ee1927a41e729119992 100644 (file)
@@ -29,6 +29,11 @@ public:
     return m_global_id;
   }
 
+  int get_min_compatible_osd(int8_t* require_osd_release) override {
+    *require_osd_release = CEPH_RELEASE_NAUTILUS;
+    return 0;
+  }
+
   int get_min_compatible_client(int8_t* min_compat_client,
                                 int8_t* require_min_compat_client) override {
     *min_compat_client = CEPH_RELEASE_MIMIC;
index cefacace748f0c97ed7c85672c6e3b5441021c9e..993382f7b9823646eef980fe1d39f2b76421cd10 100644 (file)
@@ -66,6 +66,7 @@ public:
   virtual uint32_t get_nonce() = 0;
   virtual uint64_t get_instance_id() = 0;
 
+  virtual int get_min_compatible_osd(int8_t* require_osd_release) = 0;
   virtual int get_min_compatible_client(int8_t* min_compat_client,
                                         int8_t* require_min_compat_client) = 0;