From: Jason Dillaman Date: Tue, 28 Aug 2018 19:12:10 +0000 (-0400) Subject: librados: new get_min_compatible_osd API helper methods X-Git-Tag: v14.0.1~234^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=47ed62dceb7462d27d01d8b3ce38a52f5f99427d;p=ceph.git librados: new get_min_compatible_osd API helper methods 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 --- diff --git a/src/include/rados/librados.h b/src/include/rados/librados.h index fb9989014ed2..1fa0c3f570b2 100644 --- a/src/include/rados/librados.h +++ b/src/include/rados/librados.h @@ -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 * diff --git a/src/include/rados/librados.hpp b/src/include/rados/librados.hpp index 3355e0c4c034..da92883e556b 100644 --- a/src/include/rados/librados.hpp +++ b/src/include/rados/librados.hpp @@ -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); diff --git a/src/librados/RadosClient.cc b/src/librados/RadosClient.cc index 58c24c42f25c..d99831fc397c 100644 --- a/src/librados/RadosClient.cc +++ b/src/librados/RadosClient.cc @@ -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) { diff --git a/src/librados/RadosClient.h b/src/librados/RadosClient.h index 676b9e6e95a4..d900a23de147 100644 --- a/src/librados/RadosClient.h +++ b/src/librados/RadosClient.h @@ -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); diff --git a/src/librados/librados.cc b/src/librados/librados.cc index 33ee1ba2c600..5072e59f8919 100644 --- a/src/librados/librados.cc +++ b/src/librados/librados.cc @@ -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) diff --git a/src/test/librados/misc.cc b/src/test/librados/misc.cc index aa6f76910527..50f871865665 100644 --- a/src/test/librados/misc.cc +++ b/src/test/librados/misc.cc @@ -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; diff --git a/src/test/librados_test_stub/LibradosTestStub.cc b/src/test/librados_test_stub/LibradosTestStub.cc index 38a948a85712..9066c1b54143 100644 --- a/src/test/librados_test_stub/LibradosTestStub.cc +++ b/src/test/librados_test_stub/LibradosTestStub.cc @@ -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(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(client); diff --git a/src/test/librados_test_stub/MockTestMemRadosClient.h b/src/test/librados_test_stub/MockTestMemRadosClient.h index 1f44c499ded5..c22845c1da8a 100644 --- a/src/test/librados_test_stub/MockTestMemRadosClient.h +++ b/src/test/librados_test_stub/MockTestMemRadosClient.h @@ -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)); diff --git a/src/test/librados_test_stub/TestMemRadosClient.h b/src/test/librados_test_stub/TestMemRadosClient.h index f11c69affe83..164b65c85a5f 100644 --- a/src/test/librados_test_stub/TestMemRadosClient.h +++ b/src/test/librados_test_stub/TestMemRadosClient.h @@ -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; diff --git a/src/test/librados_test_stub/TestRadosClient.h b/src/test/librados_test_stub/TestRadosClient.h index cefacace748f..993382f7b982 100644 --- a/src/test/librados_test_stub/TestRadosClient.h +++ b/src/test/librados_test_stub/TestRadosClient.h @@ -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;