From ab8594c328a78fd670b9c1cbede535cfa632d32b Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 10 Sep 2019 16:39:37 -0500 Subject: [PATCH] common/admin_socket: refactor with sync and async execute_command variants Signed-off-by: Sage Weil --- src/common/admin_socket.cc | 50 +++++++++++++++++------------- src/common/admin_socket.h | 9 ++++++ src/os/bluestore/bluestore_tool.cc | 6 ++-- 3 files changed, 42 insertions(+), 23 deletions(-) diff --git a/src/common/admin_socket.cc b/src/common/admin_socket.cc index 63652dc6ee9..ead558a1ca0 100644 --- a/src/common/admin_socket.cc +++ b/src/common/admin_socket.cc @@ -349,27 +349,9 @@ bool AdminSocket::do_accept() } std::vector cmdvec = { c }; - bufferlist out; - string rs; - int rval = 0; - - bool done = false; - 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); - fin.finish(r); - }); - { - std::unique_lock l{mylock}; - mycond.wait(l, [&done] { return done;}); - } + bufferlist empty, out; + ostringstream err; + int rval = execute_command(cmdvec, empty /* inbl */, err, &out); // Unfortunately, the asok wire protocol does not let us pass an error code, // and many asok command implementations return helpful error strings. So, @@ -419,6 +401,32 @@ void AdminSocket::do_tell_queue() } } +int AdminSocket::execute_command( + const std::vector& cmd, + const bufferlist& inbl, + std::ostream& errss, + bufferlist *outbl) +{ + bool done = false; + int rval = 0; + ceph::mutex mylock = ceph::make_mutex("admin_socket::excute_command::mylock"); + ceph::condition_variable mycond; + C_SafeCond fin(mylock, mycond, &done, &rval); + execute_command( + cmd, + inbl, + [&errss, outbl, &fin](int r, const std::string& err, bufferlist& out) { + errss << err; + outbl->claim(out); + fin.finish(r); + }); + { + std::unique_lock l{mylock}; + mycond.wait(l, [&done] { return done;}); + } + return rval; +} + void AdminSocket::execute_command( const std::vector& cmdvec, const bufferlist& inbl, diff --git a/src/common/admin_socket.h b/src/common/admin_socket.h index b6e634768d1..22606e7785d 100644 --- a/src/common/admin_socket.h +++ b/src/common/admin_socket.h @@ -96,11 +96,20 @@ public: void chown(uid_t uid, gid_t gid); void chmod(mode_t mode); + + /// execute (async) void execute_command( const std::vector& cmd, const bufferlist& inbl, std::function on_fin); + /// execute (blocking) + int execute_command( + const std::vector& cmd, + const bufferlist& inbl, + std::ostream& errss, + bufferlist *outbl); + void queue_tell_command(ref_t m); private: diff --git a/src/os/bluestore/bluestore_tool.cc b/src/os/bluestore/bluestore_tool.cc index dd227cad67b..e9a904502ee 100644 --- a/src/os/bluestore/bluestore_tool.cc +++ b/src/os/bluestore/bluestore_tool.cc @@ -844,9 +844,11 @@ int main(int argc, char **argv) } for (auto alloc_name : allocs_name) { - ceph::bufferlist out; + ceph::bufferlist in, out; + ostringstream err; bool b = admin_socket->execute_command( - {"{\"prefix\": \"bluestore allocator " + action_name + " " + alloc_name + "\"}"}, out); + {"{\"prefix\": \"bluestore allocator " + action_name + " " + alloc_name + "\"}"}, + in, err, &out); if (!b) { cerr << "failure querying '" << alloc_name << "'" << std::endl; exit(EXIT_FAILURE); -- 2.39.5