From a460a638695c3d3f7fec8d5443194921868b20d1 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 9 Sep 2019 14:52:01 -0500 Subject: [PATCH] common/admin_socket: pass input bufferlist Pass this to the async handler only for now, since the sync implementations don't currently use it. Signed-off-by: Sage Weil --- src/common/admin_socket.cc | 6 +++++- src/common/admin_socket.h | 4 ++++ src/osd/OSD.cc | 4 +++- src/osd/OSD.h | 1 + 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/common/admin_socket.cc b/src/common/admin_socket.cc index e30451821cc..63652dc6ee9 100644 --- a/src/common/admin_socket.cc +++ b/src/common/admin_socket.cc @@ -357,8 +357,10 @@ bool AdminSocket::do_accept() ceph::mutex mylock = ceph::make_mutex("admin_socket::do_accept::mylock"); ceph::condition_variable mycond; C_SafeCond fin(mylock, mycond, &done, &rval); + bufferlist empty; execute_command( cmdvec, + empty /* inbl */, [&rs, &out, &fin](int r, const std::string& err, bufferlist& outbl) { rs = err; out.claim(outbl); @@ -407,6 +409,7 @@ void AdminSocket::do_tell_queue() bufferlist outbl; execute_command( m->cmd, + m->get_data(), [m](int r, const std::string& err, bufferlist& outbl) { auto reply = new MCommandReply(r, err); reply->set_tid(m->get_tid()); @@ -418,6 +421,7 @@ void AdminSocket::do_tell_queue() void AdminSocket::execute_command( const std::vector& cmdvec, + const bufferlist& inbl, std::function on_finish) { cmdmap_t cmdmap; @@ -460,7 +464,7 @@ void AdminSocket::execute_command( if (!validate(prefix, cmdmap, empty)) { on_finish(-EINVAL, "invalid command json", empty); } else { - hook->call_async(prefix, cmdmap, format, on_finish); + hook->call_async(prefix, cmdmap, format, inbl, on_finish); } l.lock(); in_hook = false; diff --git a/src/common/admin_socket.h b/src/common/admin_socket.h index e64fc4fe28d..b6e634768d1 100644 --- a/src/common/admin_socket.h +++ b/src/common/admin_socket.h @@ -35,12 +35,15 @@ inline constexpr auto CEPH_ADMIN_SOCK_VERSION = "2"sv; class AdminSocketHook { public: + // NOTE: the sync handler doesn't take an input buffer currently because + // no users need it yet. virtual int call(std::string_view command, const cmdmap_t& cmdmap, std::string_view format, ceph::buffer::list& out) = 0; virtual void call_async( std::string_view command, const cmdmap_t& cmdmap, std::string_view format, + const bufferlist& inbl, std::function on_finish) { // by default, call the synchronous handler and then finish bufferlist out; @@ -95,6 +98,7 @@ public: void chmod(mode_t mode); void execute_command( const std::vector& cmd, + const bufferlist& inbl, std::function on_fin); void queue_tell_command(ref_t m); diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 132b3ec8c27..ad0471e77dd 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -2338,10 +2338,11 @@ public: std::string_view prefix, const cmdmap_t& cmdmap, std::string_view format, + const bufferlist& inbl, std::function on_finish) override { stringstream ss; try { - osd->asok_command(prefix, cmdmap, format, on_finish); + osd->asok_command(prefix, cmdmap, format, inbl, on_finish); } catch (const bad_cmd_get& e) { bufferlist empty; on_finish(-EINVAL, e.what(), empty); @@ -2363,6 +2364,7 @@ std::set OSD::get_mapped_pools() void OSD::asok_command( std::string_view prefix, const cmdmap_t& cmdmap, std::string_view format, + const bufferlist& inbl, std::function on_finish) { int ret = 0; diff --git a/src/osd/OSD.h b/src/osd/OSD.h index 85758fe0970..010612947ba 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -1180,6 +1180,7 @@ protected: std::string_view prefix, const cmdmap_t& cmdmap, std::string_view format, + const bufferlist& inbl, std::function on_finish); public: -- 2.39.5