]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
neorados: use a lightweight proxy object to abstract RADOS backend
authorJason Dillaman <dillaman@redhat.com>
Mon, 6 Jul 2020 19:27:48 +0000 (15:27 -0400)
committerJason Dillaman <dillaman@redhat.com>
Mon, 6 Jul 2020 20:12:35 +0000 (16:12 -0400)
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 <dillaman@redhat.com>
src/include/neorados/RADOS.hpp
src/neorados/RADOS.cc
src/neorados/RADOSImpl.h

index 288268b1505b926c3f232b4dbfaa56602339845d..dd0806741cc9fabf4528015f7e6795b7d86e8fab 100644 (file)
@@ -73,7 +73,7 @@ struct hash<neorados::IOContext>;
 
 namespace neorados {
 namespace detail {
-class RADOS;
+class Client;
 }
 
 class RADOS;
@@ -944,7 +944,7 @@ private:
 
   friend Builder;
 
-  RADOS(std::unique_ptr<detail::RADOS> impl);
+  RADOS(std::unique_ptr<detail::Client> impl);
   static void make_with_cct(CephContext* cct,
                            boost::asio::io_context& ioctx,
                    std::unique_ptr<BuildComp> c);
@@ -1068,9 +1068,8 @@ private:
                          bool force, std::unique_ptr<SimpleOpComp> c);
 
 
-  // Since detail::RADOS has immovable things inside it, hold a
-  // unique_ptr to it so we can be moved.
-  std::unique_ptr<detail::RADOS> impl;
+  // Proxy object to provide access to low-level RADOS messaging clients
+  std::unique_ptr<detail::Client> impl;
 };
 
 enum class errc {
index 836ffa9b014ae95787e0eda9be63aeec8eee7046..261cc6a937cbe2fdf2864a9073336f7e144a42cd 100644 (file)
@@ -748,9 +748,9 @@ void RADOS::make_with_cct(CephContext* cct,
                          boost::asio::io_context& ioctx,
                          std::unique_ptr<BuildComp> c) {
   try {
-    auto r = new detail::RADOS(ioctx, cct);
+    auto r = new detail::NeoClient{std::make_unique<detail::RADOS>(ioctx, cct)};
     r->objecter->wait_for_osd_map(
-      [c = std::move(c), r = std::unique_ptr<detail::RADOS>(r)]() mutable {
+      [c = std::move(c), r = std::unique_ptr<detail::Client>(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<detail::RADOS> impl)
+RADOS::RADOS(std::unique_ptr<detail::Client> 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<const IOContextImpl*>(&_ioc.impl);
   auto linger_op = impl->objecter->linger_register(*oid, ioc->oloc, 0);
 
-  auto cb = std::make_shared<NotifyHandler>(impl->ioctx, impl->objecter.get(),
+  auto cb = std::make_shared<NotifyHandler>(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<NotifyHandler>(impl->ioctx, impl->objecter.get(),
+  auto cb = std::make_shared<NotifyHandler>(impl->ioctx, impl->objecter,
                                             linger_op, std::move(c));
   linger_op->on_notify_finish =
     Objecter::LingerOp::OpComp::create(
index 8d1d959da840b2383520cce5695b0ccc76df6e62..70a4d4fb4ae15f5ca592252cb5a278751907935e 100644 (file)
 #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<CephContext> cct;
@@ -67,7 +72,49 @@ public:
     return instance_id;
   }
 };
-}
-}
+
+class Client {
+public:
+  Client(boost::asio::io_context& ioctx,
+         boost::intrusive_ptr<CephContext> 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<CephContext> 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>&& 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> rados;
+};
+
+} // namespace detail
+} // namespace neorados
 
 #endif