From 47ed62dceb7462d27d01d8b3ce38a52f5f99427d Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Tue, 28 Aug 2018 15:12:10 -0400 Subject: [PATCH] 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 --- src/include/rados/librados.h | 11 +++++++++++ src/include/rados/librados.hpp | 1 + src/librados/RadosClient.cc | 14 ++++++++++++++ src/librados/RadosClient.h | 1 + src/librados/librados.cc | 12 ++++++++++++ src/test/librados/misc.cc | 14 ++++++++++++++ src/test/librados_test_stub/LibradosTestStub.cc | 5 +++++ .../librados_test_stub/MockTestMemRadosClient.h | 6 ++++++ src/test/librados_test_stub/TestMemRadosClient.h | 5 +++++ src/test/librados_test_stub/TestRadosClient.h | 1 + 10 files changed, 70 insertions(+) diff --git a/src/include/rados/librados.h b/src/include/rados/librados.h index fb9989014ed2f..1fa0c3f570b21 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 3355e0c4c034b..da92883e556bf 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 58c24c42f25c1..d99831fc397c0 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 676b9e6e95a4a..d900a23de1472 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 33ee1ba2c6008..5072e59f8919c 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 aa6f769105276..50f8718656656 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 38a948a857120..9066c1b541438 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 1f44c499ded57..c22845c1da8a8 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 f11c69affe836..164b65c85a5f0 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 cefacace748f0..993382f7b9823 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; -- 2.39.5