namespace neorados {
namespace detail {
-class RADOS;
+class Client;
}
class RADOS;
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);
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 {
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)});
});
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;
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),
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);
{}, 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);
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(
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(
#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;
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