From: Jason Dillaman Date: Mon, 6 Jul 2020 19:27:48 +0000 (-0400) Subject: neorados: use a lightweight proxy object to abstract RADOS backend X-Git-Tag: v16.1.0~1799^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=83b82bc3d6295b76115f06cd2b83aa18085cb4af;p=ceph.git neorados: use a lightweight proxy object to abstract RADOS backend Both neorados and (legacy) librados create MON, MGR, and OSD (objecter) clients. Let the neorados frontend API directly access these clients through a generic class that can be swapped out. This will allow the neorados API to re-use a (legacy) librados RadosClient in a future commit. Signed-off-by: Jason Dillaman --- diff --git a/src/include/neorados/RADOS.hpp b/src/include/neorados/RADOS.hpp index 288268b1505b..dd0806741cc9 100644 --- a/src/include/neorados/RADOS.hpp +++ b/src/include/neorados/RADOS.hpp @@ -73,7 +73,7 @@ struct hash; namespace neorados { namespace detail { -class RADOS; +class Client; } class RADOS; @@ -944,7 +944,7 @@ private: friend Builder; - RADOS(std::unique_ptr impl); + RADOS(std::unique_ptr impl); static void make_with_cct(CephContext* cct, boost::asio::io_context& ioctx, std::unique_ptr c); @@ -1068,9 +1068,8 @@ private: bool force, std::unique_ptr c); - // Since detail::RADOS has immovable things inside it, hold a - // unique_ptr to it so we can be moved. - std::unique_ptr impl; + // Proxy object to provide access to low-level RADOS messaging clients + std::unique_ptr impl; }; enum class errc { diff --git a/src/neorados/RADOS.cc b/src/neorados/RADOS.cc index 836ffa9b014a..261cc6a937cb 100644 --- a/src/neorados/RADOS.cc +++ b/src/neorados/RADOS.cc @@ -748,9 +748,9 @@ void RADOS::make_with_cct(CephContext* cct, boost::asio::io_context& ioctx, std::unique_ptr c) { try { - auto r = new detail::RADOS(ioctx, cct); + auto r = new detail::NeoClient{std::make_unique(ioctx, cct)}; r->objecter->wait_for_osd_map( - [c = std::move(c), r = std::unique_ptr(r)]() mutable { + [c = std::move(c), r = std::unique_ptr(r)]() mutable { c->dispatch(std::move(c), bs::error_code{}, RADOS{std::move(r)}); }); @@ -762,7 +762,7 @@ void RADOS::make_with_cct(CephContext* cct, RADOS::RADOS() = default; -RADOS::RADOS(std::unique_ptr impl) +RADOS::RADOS(std::unique_ptr impl) : impl(std::move(impl)) {} RADOS::RADOS(RADOS&&) = default; @@ -873,7 +873,7 @@ void RADOS::lookup_pool(std::string_view name, if (ret < 0) { impl->objecter->wait_for_latest_osdmap( [name = std::string(name), c = std::move(c), - objecter = impl->objecter.get()] + objecter = impl->objecter] (bs::error_code ec) mutable { int64_t ret = objecter->with_osdmap(std::mem_fn(&OSDMap::lookup_pg_pool_name), @@ -1175,7 +1175,7 @@ void RADOS::unwatch(uint64_t cookie, const IOContext& _ioc, ioc->snapc, ceph::real_clock::now(), 0, Objecter::Op::OpComp::create( get_executor(), - [objecter = impl->objecter.get(), + [objecter = impl->objecter, linger_op, c = std::move(c)] (bs::error_code ec) mutable { objecter->linger_cancel(linger_op); @@ -1203,7 +1203,7 @@ void RADOS::unwatch(uint64_t cookie, std::int64_t pool, {}, ceph::real_clock::now(), 0, Objecter::Op::OpComp::create( get_executor(), - [objecter = impl->objecter.get(), + [objecter = impl->objecter, linger_op, c = std::move(c)] (bs::error_code ec) mutable { objecter->linger_cancel(linger_op); @@ -1279,7 +1279,7 @@ void RADOS::notify(const Object& o, const IOContext& _ioc, bufferlist&& bl, auto ioc = reinterpret_cast(&_ioc.impl); auto linger_op = impl->objecter->linger_register(*oid, ioc->oloc, 0); - auto cb = std::make_shared(impl->ioctx, impl->objecter.get(), + auto cb = std::make_shared(impl->ioctx, impl->objecter, linger_op, std::move(c)); linger_op->on_notify_finish = Objecter::LingerOp::OpComp::create( @@ -1318,7 +1318,7 @@ void RADOS::notify(const Object& o, std::int64_t pool, bufferlist&& bl, oloc.key = *key; auto linger_op = impl->objecter->linger_register(*oid, oloc, 0); - auto cb = std::make_shared(impl->ioctx, impl->objecter.get(), + auto cb = std::make_shared(impl->ioctx, impl->objecter, linger_op, std::move(c)); linger_op->on_notify_finish = Objecter::LingerOp::OpComp::create( diff --git a/src/neorados/RADOSImpl.h b/src/neorados/RADOSImpl.h index 8d1d959da840..70a4d4fb4ae1 100644 --- a/src/neorados/RADOSImpl.h +++ b/src/neorados/RADOSImpl.h @@ -31,12 +31,17 @@ #include "osdc/Objecter.h" namespace neorados { - class RADOS; + +class RADOS; + namespace detail { +class NeoClient; + class RADOS : public Dispatcher { friend ::neorados::RADOS; + friend NeoClient; boost::asio::io_context& ioctx; boost::intrusive_ptr cct; @@ -67,7 +72,49 @@ public: return instance_id; } }; -} -} + +class Client { +public: + Client(boost::asio::io_context& ioctx, + boost::intrusive_ptr cct, + MonClient& monclient, Objecter* objecter) + : ioctx(ioctx), cct(cct), monclient(monclient), objecter(objecter) { + } + virtual ~Client() {} + + Client(const Client&) = delete; + Client& operator=(const Client&) = delete; + + boost::asio::io_context& ioctx; + + boost::intrusive_ptr cct; + MonClient& monclient; + Objecter* objecter; + + mon_feature_t get_required_monitor_features() const { + return monclient.with_monmap(std::mem_fn(&MonMap::get_required_features)); + } + + virtual int get_instance_id() const = 0; +}; + +class NeoClient : public Client { +public: + NeoClient(std::unique_ptr&& rados) + : Client(rados->ioctx, rados->cct, rados->monclient, + rados->objecter.get()), + rados(std::move(rados)) { + } + + int get_instance_id() const override { + return rados->get_instance_id(); + } + +private: + std::unique_ptr rados; +}; + +} // namespace detail +} // namespace neorados #endif