From 2148f22db612d0c7ea3b7aa15ac91b18f63505d1 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Mon, 6 Jul 2020 16:08:56 -0400 Subject: [PATCH] neorados: build new RADOS client using legacy librados::Rados Client libraries like librbd cannot force the adaptation to neorados and it would not be ideal to have two effective RADOS cluster connections for librados and neorados. The new neorados::RADOS::make_with_librados helper method will allow neorados to re-use the existing thread pool, MGR, MON, and objecter already created for librados::Rados. Signed-off-by: Jason Dillaman --- src/include/neorados/RADOS.hpp | 3 ++ src/include/rados/librados.hpp | 6 +++- src/librados/RadosClient.h | 3 ++ src/neorados/RADOS.cc | 3 ++ src/neorados/RADOSImpl.h | 27 +++++++++++++---- src/test/neorados/CMakeLists.txt | 9 ++++++ src/test/neorados/test_neorados.cc | 47 ++++++++++++++++++++++++++++++ 7 files changed, 91 insertions(+), 7 deletions(-) create mode 100644 src/test/neorados/test_neorados.cc diff --git a/src/include/neorados/RADOS.hpp b/src/include/neorados/RADOS.hpp index dd0806741cc..5b0b011d361 100644 --- a/src/include/neorados/RADOS.hpp +++ b/src/include/neorados/RADOS.hpp @@ -55,6 +55,7 @@ #include "include/common_fwd.h" #include "include/buffer.h" +#include "include/rados/librados_fwd.hpp" #include "common/ceph_time.h" @@ -531,6 +532,8 @@ public: return init.result.get(); } + static RADOS make_with_librados(librados::Rados& rados); + RADOS(const RADOS&) = delete; RADOS& operator =(const RADOS&) = delete; diff --git a/src/include/rados/librados.hpp b/src/include/rados/librados.hpp index 53aa31925d6..7fabc7864fd 100644 --- a/src/include/rados/librados.hpp +++ b/src/include/rados/librados.hpp @@ -19,6 +19,8 @@ namespace libradosstriper class RadosStriper; } +namespace neorados { class RADOS; } + namespace librados { using ceph::bufferlist; @@ -1503,9 +1505,11 @@ inline namespace v14_2_0 { callback_t cb_safe) __attribute__ ((deprecated)); static AioCompletion *aio_create_completion(void *cb_arg, callback_t cb_complete); - + friend std::ostream& operator<<(std::ostream &oss, const Rados& r); private: + friend class neorados::RADOS; + // We don't allow assignment or copying Rados(const Rados& rhs); const Rados& operator=(const Rados& rhs); diff --git a/src/librados/RadosClient.h b/src/librados/RadosClient.h index 7475fc678d1..9292a021cdf 100644 --- a/src/librados/RadosClient.h +++ b/src/librados/RadosClient.h @@ -40,9 +40,12 @@ class MLog; class Messenger; class AioCompletionImpl; +namespace neorados { namespace detail { class RadosClient; }} + class librados::RadosClient : public Dispatcher, public md_config_obs_t { + friend neorados::detail::RadosClient; public: using Dispatcher::cct; private: diff --git a/src/neorados/RADOS.cc b/src/neorados/RADOS.cc index 261cc6a937c..8a49f05a9c4 100644 --- a/src/neorados/RADOS.cc +++ b/src/neorados/RADOS.cc @@ -759,6 +759,9 @@ void RADOS::make_with_cct(CephContext* cct, } } +RADOS RADOS::make_with_librados(librados::Rados& rados) { + return RADOS{std::make_unique(rados.client)}; +} RADOS::RADOS() = default; diff --git a/src/neorados/RADOSImpl.h b/src/neorados/RADOSImpl.h index 70a4d4fb4ae..d45ca948123 100644 --- a/src/neorados/RADOSImpl.h +++ b/src/neorados/RADOSImpl.h @@ -11,8 +11,8 @@ * Foundation. See file COPYING. * */ -#ifndef CEPH_LIBRADOS_RADOSCLIENT_H -#define CEPH_LIBRADOS_RADOSCLIENT_H +#ifndef CEPH_NEORADOS_RADOSIMPL_H +#define CEPH_NEORADOS_RADOSIMPL_H #include #include @@ -24,6 +24,8 @@ #include "common/ceph_context.h" #include "common/ceph_mutex.h" +#include "librados/RadosClient.h" + #include "mon/MonClient.h" #include "mgr/MgrClient.h" @@ -68,9 +70,6 @@ public: mon_feature_t get_required_monitor_features() const { return monclient.with_monmap(std::mem_fn(&MonMap::get_required_features)); } - int get_instance_id() const { - return instance_id; - } }; class Client { @@ -107,13 +106,29 @@ public: } int get_instance_id() const override { - return rados->get_instance_id(); + return rados->instance_id; } private: std::unique_ptr rados; }; +class RadosClient : public Client { +public: + RadosClient(librados::RadosClient* rados_client) + : Client(rados_client->poolctx, {rados_client->cct}, + rados_client->monclient, rados_client->objecter), + rados_client(rados_client) { + } + + int get_instance_id() const override { + return rados_client->instance_id; + } + +public: + librados::RadosClient* rados_client; +}; + } // namespace detail } // namespace neorados diff --git a/src/test/neorados/CMakeLists.txt b/src/test/neorados/CMakeLists.txt index 04a566de838..309b1bc6f85 100644 --- a/src/test/neorados/CMakeLists.txt +++ b/src/test/neorados/CMakeLists.txt @@ -1,3 +1,12 @@ + +add_executable(ceph_test_neorados test_neorados.cc) +target_link_libraries(ceph_test_neorados global libneorados + ${unittest_libs} + radostest + radostest-cxx + librados + GTest::GTest) + add_executable(ceph_test_neorados_start_stop start_stop.cc) target_link_libraries(ceph_test_neorados_start_stop global libneorados ${unittest_libs}) diff --git a/src/test/neorados/test_neorados.cc b/src/test/neorados/test_neorados.cc new file mode 100644 index 00000000000..953e772e115 --- /dev/null +++ b/src/test/neorados/test_neorados.cc @@ -0,0 +1,47 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#include "include/rados/librados.hpp" +#include "include/neorados/RADOS.hpp" +#include "common/async/blocked_completion.h" +#include "test/librados/test_cxx.h" +#include "gtest/gtest.h" +#include + +namespace neorados { + +class TestNeoRADOS : public ::testing::Test { +public: + TestNeoRADOS() { + } +}; + +TEST_F(TestNeoRADOS, MakeWithLibRADOS) { + librados::Rados paleo_rados; + auto result = connect_cluster_pp(paleo_rados); + ASSERT_EQ("", result); + + auto rados = RADOS::make_with_librados(paleo_rados); + + ReadOp op; + bufferlist bl; + op.read(0, 0, &bl); + + // provide pool that doesn't exists -- just testing round-trip + ASSERT_THROW( + rados.execute({"dummy-obj"}, std::numeric_limits::max(), + std::move(op), nullptr, ceph::async::use_blocked), + boost::system::system_error); +} + +} // namespace neorados + +int main(int argc, char **argv) { + ::testing::InitGoogleTest(&argc, argv); + + int seed = getpid(); + std::cout << "seed " << seed << std::endl; + srand(seed); + + return RUN_ALL_TESTS(); +} -- 2.47.3