initial_image_size = info.size;
+ CephContext* cct = reinterpret_cast<CephContext*>(io_ctx.cct());
+ ceph_assert(cct != nullptr);
+
handler = new WnbdHandler(image, cfg.devpath,
info.size / RBD_WNBD_BLKSIZE,
RBD_WNBD_BLKSIZE,
!cfg.snapname.empty() || cfg.readonly,
g_conf().get_val<bool>("rbd_cache"),
cfg.io_req_workers,
- cfg.io_reply_workers);
+ cfg.io_reply_workers,
+ cct->get_admin_socket());
return 0;
}
return err;
}
-WnbdAdminHook::WnbdAdminHook(WnbdHandler *handler) : m_handler(handler)
+WnbdAdminHook::WnbdAdminHook(WnbdHandler *handler, AdminSocket* admin_socket)
+ : m_handler(handler)
+ , m_admin_socket(admin_socket)
{
- g_ceph_context->get_admin_socket()->register_command(
- std::string("wnbd stats ") + m_handler->instance_name,
- this, "get WNBD stats");
+ if (m_admin_socket) {
+ m_admin_socket->register_command(
+ std::string("wnbd stats ") + m_handler->instance_name,
+ this, "get WNBD stats");
+ } else {
+ dout(0) << "no admin socket provided, skipped registering wnbd hooks"
+ << dendl;
+ }
}
int WnbdAdminHook::call (
class WnbdAdminHook : public AdminSocketHook {
WnbdHandler *m_handler;
+ AdminSocket *m_admin_socket;
public:
- explicit WnbdAdminHook(WnbdHandler *handler);
+ explicit WnbdAdminHook(WnbdHandler *handler, AdminSocket* admin_socket);
~WnbdAdminHook() override {
- g_ceph_context->get_admin_socket()->unregister_commands(this);
+ if (m_admin_socket) {
+ m_admin_socket->unregister_commands(this);
+ }
}
int call(std::string_view command, const cmdmap_t& cmdmap,
uint64_t _block_count, uint32_t _block_size,
bool _readonly, bool _rbd_cache_enabled,
uint32_t _io_req_workers,
- uint32_t _io_reply_workers)
+ uint32_t _io_reply_workers,
+ AdminSocket* admin_socket)
: image(_image)
, instance_name(_instance_name)
, block_count(_block_count)
, io_req_workers(_io_req_workers)
, io_reply_workers(_io_reply_workers)
{
- admin_hook = new WnbdAdminHook(this);
+ admin_hook = new WnbdAdminHook(this, admin_socket);
// Instead of relying on librbd's own thread pool, we're going to use a
// separate one. This allows us to make assumptions on the threads that
// are going to send the IO replies and thus be able to cache Windows