diff options
Diffstat (limited to 'src/librbd/AsioEngine.cc')
-rw-r--r-- | src/librbd/AsioEngine.cc | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/src/librbd/AsioEngine.cc b/src/librbd/AsioEngine.cc new file mode 100644 index 000000000..8e2beb49c --- /dev/null +++ b/src/librbd/AsioEngine.cc @@ -0,0 +1,56 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#include "librbd/AsioEngine.h" +#include "include/Context.h" +#include "include/neorados/RADOS.hpp" +#include "include/rados/librados.hpp" +#include "common/dout.h" +#include "librbd/asio/ContextWQ.h" + +#define dout_subsys ceph_subsys_rbd +#undef dout_prefix +#define dout_prefix *_dout << "librbd::AsioEngine: " \ + << this << " " << __func__ << ": " + +namespace librbd { + +AsioEngine::AsioEngine(std::shared_ptr<librados::Rados> rados) + : m_rados_api(std::make_shared<neorados::RADOS>( + neorados::RADOS::make_with_librados(*rados))), + m_cct(m_rados_api->cct()), + m_io_context(m_rados_api->get_io_context()), + m_api_strand(std::make_unique<boost::asio::io_context::strand>( + m_io_context)), + m_context_wq(std::make_unique<asio::ContextWQ>(m_cct, m_io_context)) { + ldout(m_cct, 20) << dendl; + + auto rados_threads = m_cct->_conf.get_val<uint64_t>("librados_thread_count"); + auto rbd_threads = m_cct->_conf.get_val<uint64_t>("rbd_op_threads"); + if (rbd_threads > rados_threads) { + // inherit the librados thread count -- but increase it if librbd wants to + // utilize more threads + m_cct->_conf.set_val_or_die("librados_thread_count", + std::to_string(rbd_threads)); + m_cct->_conf.apply_changes(nullptr); + } +} + +AsioEngine::AsioEngine(librados::IoCtx& io_ctx) + : AsioEngine(std::make_shared<librados::Rados>(io_ctx)) { +} + +AsioEngine::~AsioEngine() { + ldout(m_cct, 20) << dendl; + m_api_strand.reset(); +} + +void AsioEngine::dispatch(Context* ctx, int r) { + dispatch([ctx, r]() { ctx->complete(r); }); +} + +void AsioEngine::post(Context* ctx, int r) { + post([ctx, r]() { ctx->complete(r); }); +} + +} // namespace librbd |