namespace detail {
RADOS::RADOS(boost::asio::io_context& ioctx,
- boost::intrusive_ptr<CephContext> _cct)
- : Dispatcher(_cct.detach()),
+ boost::intrusive_ptr<CephContext> cct)
+ : Dispatcher(cct.get()),
ioctx(ioctx),
- monclient(cct, ioctx),
- moncsd(monclient),
- mgrclient(cct, nullptr, &monclient.monmap),
- mgrcsd(mgrclient) {
+ cct(cct),
+ monclient(cct.get(), ioctx),
+ mgrclient(cct.get(), nullptr, &monclient.monmap) {
auto err = monclient.build_initial_monmap();
if (err < 0)
throw std::system_error(ceph::to_error_code(err));
- messenger.reset(Messenger::create_client_messenger(cct, "radosclient"));
+ messenger.reset(Messenger::create_client_messenger(cct.get(), "radosclient"));
if (!messenger)
throw std::bad_alloc();
messenger->set_default_policy(
Messenger::Policy::lossy_client(CEPH_FEATURE_OSDREPLYMUX));
- objecter.reset(new Objecter(cct, messenger.get(), &monclient,
+ objecter.reset(new Objecter(cct.get(), messenger.get(), &monclient,
ioctx,
cct->_conf->rados_mon_op_timeout,
cct->_conf->rados_osd_op_timeout));
instance_id = monclient.get_global_id();
}
+RADOS::~RADOS() {
+ if (objecter && objecter->initialized) {
+ objecter->shutdown();
+ }
+
+ mgrclient.shutdown();
+ monclient.shutdown();
+
+ if (messenger) {
+ messenger->shutdown();
+ messenger->wait();
+ }
+}
+
bool RADOS::ms_dispatch(Message *m)
{
switch (m->get_type()) {
return false;
}
-RADOS::~RADOS() = default;
-}
-}
+} // namespace detail
+} // namespace neorados
class RADOS : public Dispatcher
{
friend ::neorados::RADOS;
- struct MsgDeleter {
- void operator()(Messenger* p) const {
- if (p) {
- p->shutdown();
- p->wait();
- }
- delete p;
- }
- };
-
- struct ObjDeleter {
- void operator()(Objecter* p) const {
- if (p) {
- p->shutdown();
- }
- delete p;
- }
- };
-
- template<typename T>
- struct scoped_shutdown {
- T& m;
- scoped_shutdown(T& m) : m(m) {}
-
- ~scoped_shutdown() {
- m.shutdown();
- }
- };
boost::asio::io_context& ioctx;
+ boost::intrusive_ptr<CephContext> cct;
+
ceph::mutex lock = ceph::make_mutex("RADOS_unleashed::_::RADOSImpl");
int instance_id = -1;
- std::unique_ptr<Messenger, MsgDeleter> messenger;
+ std::unique_ptr<Messenger> messenger;
MonClient monclient;
- scoped_shutdown<MonClient> moncsd;
-
MgrClient mgrclient;
- scoped_shutdown<MgrClient> mgrcsd;
-
- std::unique_ptr<Objecter, ObjDeleter> objecter;
+ std::unique_ptr<Objecter> objecter;
public: