From 9d772b8ea9e582075009cea6b8a6b6868e8e531a Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 6 Sep 2019 10:36:31 -0500 Subject: [PATCH] common/admin_socket: return int from hook call() Previously, call() returned a bool. Return an int instead so we can wire this up to tell command return values. The admin socket 'ceph daemon ...' unix domain socket protocol does not pass a return code, only data, so we cannot pass these errors that way. We have two choices: make error codes silently succeed when accessed via asok (so that we get an error string etc), or make them fail without any specific error code or string. Unfortunately, there are several cases where an exception was caught and what() returned as a string, or where error strings are returned. These would "blindly" fail if we took the latter approach. So, for the asok interface, -ENOSYS means a "hard" error that gives the user no data and makes the 'ceph daemon ...' command return an error code. Other error codes are interpreted as a success. This is ONLY for the asok interface; the tell interface has full fidelity with error codes and error strings. Note that this means that 'net new' tell-style commands that we move over to this handler will also appear to succeed via the 'ceph daemon' interface when they return error codes. Signed-off-by: Sage Weil --- src/client/Client.cc | 9 ++-- src/client/Client.h | 4 +- src/common/admin_socket.cc | 71 ++++++++++++++++----------- src/common/admin_socket.h | 4 +- src/common/ceph_context.cc | 16 +++--- src/librbd/LibrbdAdminSocketHook.cc | 10 ++-- src/librbd/LibrbdAdminSocketHook.h | 4 +- src/mds/MDSDaemon.cc | 17 ++++--- src/mds/MDSDaemon.h | 4 +- src/mds/MDSRank.cc | 22 ++++----- src/mds/MDSRank.h | 4 +- src/mgr/ClusterState.cc | 8 +-- src/mon/Monitor.cc | 4 +- src/os/bluestore/Allocator.cc | 8 +-- src/os/bluestore/BlueFS.cc | 8 +-- src/osd/OSD.cc | 16 +++--- src/osdc/Objecter.cc | 14 +++--- src/rgw/rgw_coroutine.cc | 4 +- src/rgw/rgw_coroutine.h | 4 +- src/rgw/rgw_sync_trace.cc | 6 +-- src/rgw/rgw_sync_trace.h | 4 +- src/rgw/services/svc_sys_obj_cache.cc | 25 +++++----- src/test/admin_socket.cc | 18 +++---- src/tools/rbd_mirror/ImageDeleter.cc | 6 +-- src/tools/rbd_mirror/ImageReplayer.cc | 6 +-- src/tools/rbd_mirror/Mirror.cc | 6 +-- src/tools/rbd_mirror/PoolReplayer.cc | 6 +-- 27 files changed, 163 insertions(+), 145 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 27e3043ef3a6a..6081a96eef808 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -138,9 +138,10 @@ Client::CommandHook::CommandHook(Client *client) : { } -bool Client::CommandHook::call(std::string_view command, - const cmdmap_t& cmdmap, - std::string_view format, bufferlist& out) +int Client::CommandHook::call( + std::string_view command, + const cmdmap_t& cmdmap, + std::string_view format, bufferlist& out) { std::unique_ptr f(Formatter::create(format)); f->open_object_section("result"); @@ -161,7 +162,7 @@ bool Client::CommandHook::call(std::string_view command, } f->close_section(); f->flush(out); - return true; + return 0; } diff --git a/src/client/Client.h b/src/client/Client.h index 612c1ec50170b..9b634f54b105f 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -265,8 +265,8 @@ public: class CommandHook : public AdminSocketHook { public: explicit CommandHook(Client *client); - bool call(std::string_view command, const cmdmap_t& cmdmap, - std::string_view format, bufferlist& out) override; + int call(std::string_view command, const cmdmap_t& cmdmap, + std::string_view format, bufferlist& out) override; private: Client *m_client; }; diff --git a/src/common/admin_socket.cc b/src/common/admin_socket.cc index 898c8534809a1..16c811f4e88a6 100644 --- a/src/common/admin_socket.cc +++ b/src/common/admin_socket.cc @@ -346,25 +346,33 @@ bool AdminSocket::do_accept() } } - bool rval; bufferlist out; std::vector cmdvec = { c }; - rval = execute_command(cmdvec, out); - if (rval) { + int rval = execute_command(cmdvec, out); + // Unfortunately, the asok wire protocol does not let us pass an error code, + // and many asok command implementations return helpful error strings. So, + // let's interpret all but -ENOSYS as a "success" so that the user can still + // see those messages. This provides the same behavior as what users saw + // pre-octopus; the only drawback is that net new 'tell-style' commands that + // return error codes will also be seen as "success" via asok unless/until + // we extend the socket protocol. + if (rval != -ENOSYS) { + rval = 0; // sigh.. fixme someday! uint32_t len = htonl(out.length()); int ret = safe_write(connection_fd, &len, sizeof(len)); if (ret < 0) { lderr(m_cct) << "AdminSocket: error writing response length " << cpp_strerror(ret) << dendl; - rval = false; + rval = -EIO; } else { - if (out.write_fd(connection_fd) >= 0) - rval = true; + if (out.write_fd(connection_fd) < 0) { + rval = -EIO; + } } } retry_sys_call(::close, connection_fd); - return rval; + return rval >= 0; } void AdminSocket::do_tell_queue() @@ -377,8 +385,7 @@ void AdminSocket::do_tell_queue() } for (auto& m : q) { bufferlist outbl; - bool success = execute_command(m->cmd, outbl); - int r = success ? 0 : -1; // FIXME! + int r = execute_command(m->cmd, outbl); auto reply = new MCommandReply(r, ""); reply->set_tid(m->get_tid()); reply->set_data(outbl); @@ -395,14 +402,14 @@ int AdminSocket::execute_command(const std::vector& cmdvec, ldout(m_cct,10) << __func__ << " cmdvec='" << cmdvec << "'" << dendl; if (!cmdmap_from_json(cmdvec, &cmdmap, errss)) { ldout(m_cct, 0) << "AdminSocket: " << errss.str() << dendl; - return false; + return -EINVAL; } string prefix; try { cmd_getval(m_cct, cmdmap, "format", format); cmd_getval(m_cct, cmdmap, "prefix", prefix); } catch (const bad_cmd_get& e) { - return false; + return -EINVAL; } if (format != "json" && format != "json-pretty" && format != "xml" && format != "xml-pretty") @@ -414,7 +421,7 @@ int AdminSocket::execute_command(const std::vector& cmdvec, if (p == hooks.cend()) { lderr(m_cct) << "AdminSocket: request '" << cmdvec << "' not defined" << dendl; - return false; + return -ENOSYS; } // Drop lock to avoid cycles in cases where the hook takes @@ -424,21 +431,27 @@ int AdminSocket::execute_command(const std::vector& cmdvec, in_hook = true; auto hook = p->second.hook; l.unlock(); - bool success = (validate(prefix, cmdmap, out) && - hook->call(prefix, cmdmap, format, out)); + int r; + if (!validate(prefix, cmdmap, out)) { + r = -EINVAL; + } else { + r = hook->call(prefix, cmdmap, format, out); + } l.lock(); in_hook = false; in_hook_cond.notify_all(); - if (!success) { + if (r < 0) { ldout(m_cct, 0) << "AdminSocket: request '" << prefix - << "' to " << hook << " failed" << dendl; + << "' to " << hook << " failed, " << cpp_strerror(r) + << dendl; out.append("failed"); } else { ldout(m_cct, 5) << "AdminSocket: request '" << prefix - << "' to " << hook - << " returned " << out.length() << " bytes" << dendl; + << "' to " << hook + << " returned " << r << " and " << out.length() << " bytes" + << dendl; } - return true; + return r; } void AdminSocket::queue_tell_command(ref_t m) @@ -508,8 +521,8 @@ void AdminSocket::unregister_commands(const AdminSocketHook *hook) class VersionHook : public AdminSocketHook { public: - bool call(std::string_view command, const cmdmap_t& cmdmap, - std::string_view format, bufferlist& out) override { + int call(std::string_view command, const cmdmap_t& cmdmap, + std::string_view format, bufferlist& out) override { if (command == "0"sv) { out.append(CEPH_ADMIN_SOCK_VERSION); } else { @@ -528,7 +541,7 @@ public: jf.flush(ss); out.append(ss.str()); } - return true; + return 0; } }; @@ -536,9 +549,9 @@ class HelpHook : public AdminSocketHook { AdminSocket *m_as; public: explicit HelpHook(AdminSocket *as) : m_as(as) {} - bool call(std::string_view command, const cmdmap_t& cmdmap, - std::string_view format, - bufferlist& out) override { + int call(std::string_view command, const cmdmap_t& cmdmap, + std::string_view format, + bufferlist& out) override { std::unique_ptr f(Formatter::create(format, "json-pretty"sv, "json-pretty"sv)); f->open_object_section("help"); @@ -550,7 +563,7 @@ public: ostringstream ss; f->flush(ss); out.append(ss.str()); - return true; + return 0; } }; @@ -558,8 +571,8 @@ class GetdescsHook : public AdminSocketHook { AdminSocket *m_as; public: explicit GetdescsHook(AdminSocket *as) : m_as(as) {} - bool call(std::string_view command, const cmdmap_t& cmdmap, - std::string_view format, bufferlist& out) override { + int call(std::string_view command, const cmdmap_t& cmdmap, + std::string_view format, bufferlist& out) override { int cmdnum = 0; JSONFormatter jf; jf.open_object_section("command_descriptions"); @@ -581,7 +594,7 @@ public: ostringstream ss; jf.flush(ss); out.append(ss.str()); - return true; + return 0; } }; diff --git a/src/common/admin_socket.h b/src/common/admin_socket.h index 2249ef852e555..efa222ddedc9a 100644 --- a/src/common/admin_socket.h +++ b/src/common/admin_socket.h @@ -35,8 +35,8 @@ inline constexpr auto CEPH_ADMIN_SOCK_VERSION = "2"sv; class AdminSocketHook { public: - virtual bool call(std::string_view command, const cmdmap_t& cmdmap, - std::string_view format, ceph::buffer::list& out) = 0; + virtual int call(std::string_view command, const cmdmap_t& cmdmap, + std::string_view format, ceph::buffer::list& out) = 0; virtual ~AdminSocketHook() {} }; diff --git a/src/common/ceph_context.cc b/src/common/ceph_context.cc index ee5b44b81cb7b..1cbc2aed5d832 100644 --- a/src/common/ceph_context.cc +++ b/src/common/ceph_context.cc @@ -166,17 +166,17 @@ public: } // AdminSocketHook - bool call(std::string_view command, const cmdmap_t& cmdmap, - std::string_view format, bufferlist& out) override { + int call(std::string_view command, const cmdmap_t& cmdmap, + std::string_view format, bufferlist& out) override { if (command == "dump_mempools") { std::unique_ptr f(Formatter::create(format)); f->open_object_section("mempools"); mempool::dump(f.get()); f->close_section(); f->flush(out); - return true; + return 0; } - return false; + return -ENOSYS; } }; @@ -437,14 +437,14 @@ class CephContextHook : public AdminSocketHook { public: explicit CephContextHook(CephContext *cct) : m_cct(cct) {} - bool call(std::string_view command, const cmdmap_t& cmdmap, - std::string_view format, bufferlist& out) override { + int call(std::string_view command, const cmdmap_t& cmdmap, + std::string_view format, bufferlist& out) override { try { m_cct->do_command(command, cmdmap, format, &out); } catch (const bad_cmd_get& e) { - return false; + return -EINVAL; } - return true; + return 0; } }; diff --git a/src/librbd/LibrbdAdminSocketHook.cc b/src/librbd/LibrbdAdminSocketHook.cc index 7f713a67c9620..35b7e3c16ad58 100644 --- a/src/librbd/LibrbdAdminSocketHook.cc +++ b/src/librbd/LibrbdAdminSocketHook.cc @@ -88,14 +88,14 @@ LibrbdAdminSocketHook::~LibrbdAdminSocketHook() { } } -bool LibrbdAdminSocketHook::call(std::string_view command, - const cmdmap_t& cmdmap, - std::string_view format, - bufferlist& out) { +int LibrbdAdminSocketHook::call(std::string_view command, + const cmdmap_t& cmdmap, + std::string_view format, + bufferlist& out) { Commands::const_iterator i = commands.find(command); ceph_assert(i != commands.end()); stringstream ss; - bool r = i->second->call(&ss); + int r = i->second->call(&ss); out.append(ss); return r; } diff --git a/src/librbd/LibrbdAdminSocketHook.h b/src/librbd/LibrbdAdminSocketHook.h index 8b1b5b9422f63..a06bcb11918e5 100644 --- a/src/librbd/LibrbdAdminSocketHook.h +++ b/src/librbd/LibrbdAdminSocketHook.h @@ -17,8 +17,8 @@ namespace librbd { LibrbdAdminSocketHook(ImageCtx *ictx); ~LibrbdAdminSocketHook() override; - bool call(std::string_view command, const cmdmap_t& cmdmap, - std::string_view format, bufferlist& out) override; + int call(std::string_view command, const cmdmap_t& cmdmap, + std::string_view format, bufferlist& out) override; private: typedef std::mapasok_command(command, cmdmap, format, ss); + int r = mds->asok_command(command, cmdmap, format, ss); out.append(ss); return r; } }; -bool MDSDaemon::asok_command(std::string_view command, const cmdmap_t& cmdmap, - std::string_view format, std::ostream& ss) +int MDSDaemon::asok_command(std::string_view command, const cmdmap_t& cmdmap, + std::string_view format, std::ostream& ss) { dout(1) << "asok_command: " << command << " (starting...)" << dendl; Formatter *f = Formatter::create(format, "json-pretty", "json-pretty"); - bool handled = false; + int r = -ENOSYS; if (command == "status") { dump_status(f); - handled = true; + r = 0; } else { if (mds_rank == NULL) { dout(1) << "Can't run that command on an inactive MDS!" << dendl; f->dump_string("error", "mds_not_active"); } else { try { - handled = mds_rank->handle_asok_command(command, cmdmap, f, ss); + r = mds_rank->handle_asok_command(command, cmdmap, f, ss); } catch (const bad_cmd_get& e) { ss << e.what(); + r = -EINVAL; } } } @@ -149,7 +150,7 @@ bool MDSDaemon::asok_command(std::string_view command, const cmdmap_t& cmdmap, dout(1) << "asok_command: " << command << " (complete)" << dendl; - return handled; + return r; } void MDSDaemon::dump_status(Formatter *f) diff --git a/src/mds/MDSDaemon.h b/src/mds/MDSDaemon.h index 0b9abede8efc4..7448eed3d9558 100644 --- a/src/mds/MDSDaemon.h +++ b/src/mds/MDSDaemon.h @@ -115,8 +115,8 @@ class MDSDaemon : public Dispatcher { void set_up_admin_socket(); void clean_up_admin_socket(); void check_ops_in_flight(); // send off any slow ops to monitor - bool asok_command(std::string_view command, const cmdmap_t& cmdmap, - std::string_view format, ostream& ss); + int asok_command(std::string_view command, const cmdmap_t& cmdmap, + std::string_view format, ostream& ss); void dump_status(Formatter *f); diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc index c61ab5e408f01..e77c765ddd650 100644 --- a/src/mds/MDSRank.cc +++ b/src/mds/MDSRank.cc @@ -2433,13 +2433,13 @@ void MDSRank::handle_mds_failure(mds_rank_t who) snapclient->handle_mds_failure(who); } -bool MDSRankDispatcher::handle_asok_command(std::string_view command, - const cmdmap_t& cmdmap, - Formatter *f, - std::ostream& ss) +int MDSRankDispatcher::handle_asok_command(std::string_view command, + const cmdmap_t& cmdmap, + Formatter *f, + std::ostream& ss) { if (command == "dump_ops_in_flight" || - command == "ops") { + command == "ops") { if (!op_tracker.dump_ops_in_flight(f)) { ss << "op_tracker tracking is not enabled now, so no ops are tracked currently, even those get stuck. \ please enable \"mds_enable_op_tracker\", and the tracker will start to track new ops received afterwards."; @@ -2465,7 +2465,7 @@ bool MDSRankDispatcher::handle_asok_command(std::string_view command, if (!got_val) { ss << "no target epoch given"; - return true; + return -EINVAL; } { std::lock_guard l(mds_lock); @@ -2488,7 +2488,7 @@ bool MDSRankDispatcher::handle_asok_command(std::string_view command, const bool got_arg = cmd_getval(g_ceph_context, cmdmap, "client_id", client_id); if(!got_arg) { ss << "Invalid client_id specified"; - return true; + return -ENOENT; } std::lock_guard l(mds_lock); std::stringstream dss; @@ -2536,12 +2536,12 @@ bool MDSRankDispatcher::handle_asok_command(std::string_view command, string path; if(!cmd_getval(g_ceph_context, cmdmap, "path", path)) { ss << "malformed path"; - return true; + return -EINVAL; } int64_t rank; if(!cmd_getval(g_ceph_context, cmdmap, "rank", rank)) { ss << "malformed rank"; - return true; + return -EINVAL; } command_export_dir(f, path, (mds_rank_t)rank); } else if (command == "dump cache") { @@ -2601,10 +2601,10 @@ bool MDSRankDispatcher::handle_asok_command(std::string_view command, } else if (command == "dump inode") { command_dump_inode(f, cmdmap, ss); } else { - return false; + return -ENOSYS; } - return true; + return 0; } class C_MDS_Send_Command_Reply : public MDSInternalContext { diff --git a/src/mds/MDSRank.h b/src/mds/MDSRank.h index 4a708894cdd20..a205ccb766178 100644 --- a/src/mds/MDSRank.h +++ b/src/mds/MDSRank.h @@ -627,8 +627,8 @@ public: void init(); void tick(); void shutdown(); - bool handle_asok_command(std::string_view command, const cmdmap_t& cmdmap, - Formatter *f, std::ostream& ss); + int handle_asok_command(std::string_view command, const cmdmap_t& cmdmap, + Formatter *f, std::ostream& ss); void handle_mds_map(const cref_t &m, const MDSMap &oldmap); void handle_osd_map(); void update_log_config(); diff --git a/src/mgr/ClusterState.cc b/src/mgr/ClusterState.cc index 12b30adc0fffe..9c95bbb1661f6 100644 --- a/src/mgr/ClusterState.cc +++ b/src/mgr/ClusterState.cc @@ -181,15 +181,15 @@ class ClusterSocketHook : public AdminSocketHook { ClusterState *cluster_state; public: explicit ClusterSocketHook(ClusterState *o) : cluster_state(o) {} - bool call(std::string_view admin_command, const cmdmap_t& cmdmap, - std::string_view format, bufferlist& out) override { + int call(std::string_view admin_command, const cmdmap_t& cmdmap, + std::string_view format, bufferlist& out) override { stringstream ss; - bool r = true; + int r = 0; try { r = cluster_state->asok_command(admin_command, cmdmap, format, ss); } catch (const bad_cmd_get& e) { ss << e.what(); - r = true; + r = -EINVAL; } out.append(ss); return r; diff --git a/src/mon/Monitor.cc b/src/mon/Monitor.cc index 946fcdd727924..01d945a466787 100644 --- a/src/mon/Monitor.cc +++ b/src/mon/Monitor.cc @@ -263,12 +263,12 @@ class AdminHook : public AdminSocketHook { Monitor *mon; public: explicit AdminHook(Monitor *m) : mon(m) {} - bool call(std::string_view command, const cmdmap_t& cmdmap, + int call(std::string_view command, const cmdmap_t& cmdmap, std::string_view format, bufferlist& out) override { stringstream ss; mon->do_admin_command(command, cmdmap, format, ss); out.append(ss); - return true; + return 0; } }; diff --git a/src/os/bluestore/Allocator.cc b/src/os/bluestore/Allocator.cc index 8e5b1b6f4f346..7ec94186c5a5b 100644 --- a/src/os/bluestore/Allocator.cc +++ b/src/os/bluestore/Allocator.cc @@ -50,10 +50,10 @@ public: } } - bool call(std::string_view command, const cmdmap_t& cmdmap, - std::string_view format, bufferlist& out) override { + int call(std::string_view command, const cmdmap_t& cmdmap, + std::string_view format, bufferlist& out) override { stringstream ss; - bool r = true; + bool r = 0; if (command == "bluestore allocator dump " + name) { Formatter *f = Formatter::create(format, "json-pretty", "json-pretty"); f->open_array_section("free_regions"); @@ -89,7 +89,7 @@ public: delete f; } else { ss << "Invalid command" << std::endl; - r = false; + r = -ENOSYS; } out.append(ss); return r; diff --git a/src/os/bluestore/BlueFS.cc b/src/os/bluestore/BlueFS.cc index 06a574232c570..e1c47d6130404 100644 --- a/src/os/bluestore/BlueFS.cc +++ b/src/os/bluestore/BlueFS.cc @@ -73,10 +73,10 @@ public: private: SocketHook(BlueFS* bluefs) : bluefs(bluefs) {} - bool call(std::string_view command, const cmdmap_t& cmdmap, - std::string_view format, bufferlist& out) override { + int call(std::string_view command, const cmdmap_t& cmdmap, + std::string_view format, bufferlist& out) override { stringstream ss; - bool r = true; + bool r = 0; if (command == "bluestore bluefs available") { int64_t alloc_size = 0; cmd_getval(bluefs->cct, cmdmap, "alloc_size", alloc_size); @@ -106,7 +106,7 @@ private: delete f; } else { ss << "Invalid command" << std::endl; - r = false; + r = -ENOSYS; } out.append(ss); return r; diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index e0bdbfd97e757..4c1812aead3bf 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -2330,15 +2330,15 @@ class OSDSocketHook : public AdminSocketHook { OSD *osd; public: explicit OSDSocketHook(OSD *o) : osd(o) {} - bool call(std::string_view admin_command, const cmdmap_t& cmdmap, - std::string_view format, bufferlist& out) override { + int call(std::string_view admin_command, const cmdmap_t& cmdmap, + std::string_view format, bufferlist& out) override { stringstream ss; - bool r = true; + int r; try { r = osd->asok_command(admin_command, cmdmap, format, ss); } catch (const bad_cmd_get& e) { ss << e.what(); - r = true; + r = -EINVAL; } out.append(ss); return r; @@ -2740,16 +2740,18 @@ class TestOpsSocketHook : public AdminSocketHook { ObjectStore *store; public: TestOpsSocketHook(OSDService *s, ObjectStore *st) : service(s), store(st) {} - bool call(std::string_view command, const cmdmap_t& cmdmap, - std::string_view format, bufferlist& out) override { + int call(std::string_view command, const cmdmap_t& cmdmap, + std::string_view format, bufferlist& out) override { stringstream ss; + int r = 0; try { test_ops(service, store, command, cmdmap, ss); } catch (const bad_cmd_get& e) { ss << e.what(); + r = -EINVAL; } out.append(ss); - return true; + return r; } void test_ops(OSDService *service, ObjectStore *store, std::string_view command, const cmdmap_t& cmdmap, ostream &ss); diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index 3799ece8572a5..a6db93d3dc6e5 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -176,8 +176,8 @@ class Objecter::RequestStateHook : public AdminSocketHook { Objecter *m_objecter; public: explicit RequestStateHook(Objecter *objecter); - bool call(std::string_view command, const cmdmap_t& cmdmap, - std::string_view format, ceph::buffer::list& out) override; + int call(std::string_view command, const cmdmap_t& cmdmap, + std::string_view format, ceph::buffer::list& out) override; }; /** @@ -4707,17 +4707,17 @@ Objecter::RequestStateHook::RequestStateHook(Objecter *objecter) : { } -bool Objecter::RequestStateHook::call(std::string_view command, - const cmdmap_t& cmdmap, - std::string_view format, - ceph::buffer::list& out) +int Objecter::RequestStateHook::call(std::string_view command, + const cmdmap_t& cmdmap, + std::string_view format, + ceph::buffer::list& out) { Formatter *f = Formatter::create(format, "json-pretty", "json-pretty"); shared_lock rl(m_objecter->rwlock); m_objecter->dump_requests(f); f->flush(out); delete f; - return true; + return 0; } void Objecter::blacklist_self(bool set) diff --git a/src/rgw/rgw_coroutine.cc b/src/rgw/rgw_coroutine.cc index fbaa6ecf796d6..60d29bde9d0fa 100644 --- a/src/rgw/rgw_coroutine.cc +++ b/src/rgw/rgw_coroutine.cc @@ -852,7 +852,7 @@ int RGWCoroutinesManagerRegistry::hook_to_admin_command(const string& command) return 0; } -bool RGWCoroutinesManagerRegistry::call(std::string_view command, +int RGWCoroutinesManagerRegistry::call(std::string_view command, const cmdmap_t& cmdmap, std::string_view format, bufferlist& out) { @@ -862,7 +862,7 @@ bool RGWCoroutinesManagerRegistry::call(std::string_view command, ::encode_json("cr_managers", *this, &f); f.flush(ss); out.append(ss); - return true; + return 0; } void RGWCoroutinesManagerRegistry::dump(Formatter *f) const { diff --git a/src/rgw/rgw_coroutine.h b/src/rgw/rgw_coroutine.h index 5c41133263a17..9e7ac5673e5aa 100644 --- a/src/rgw/rgw_coroutine.h +++ b/src/rgw/rgw_coroutine.h @@ -559,8 +559,8 @@ public: void remove(RGWCoroutinesManager *mgr); int hook_to_admin_command(const string& command); - bool call(std::string_view command, const cmdmap_t& cmdmap, - std::string_view format, bufferlist& out) override; + int call(std::string_view command, const cmdmap_t& cmdmap, + std::string_view format, bufferlist& out) override; void dump(Formatter *f) const; }; diff --git a/src/rgw/rgw_sync_trace.cc b/src/rgw/rgw_sync_trace.cc index 02f3ca178aa8a..d086c06e98725 100644 --- a/src/rgw/rgw_sync_trace.cc +++ b/src/rgw/rgw_sync_trace.cc @@ -195,8 +195,8 @@ string RGWSyncTraceManager::get_active_names() return ss.str(); } -bool RGWSyncTraceManager::call(std::string_view command, const cmdmap_t& cmdmap, - std::string_view format, bufferlist& out) { +int RGWSyncTraceManager::call(std::string_view command, const cmdmap_t& cmdmap, + std::string_view format, bufferlist& out) { bool show_history = (command == "sync trace history"); bool show_short = (command == "sync trace active_short"); @@ -254,7 +254,7 @@ bool RGWSyncTraceManager::call(std::string_view command, const cmdmap_t& cmdmap, f.flush(ss); out.append(ss); - return true; + return 0; } void RGWSyncTraceManager::finish_node(RGWSyncTraceNode *node) diff --git a/src/rgw/rgw_sync_trace.h b/src/rgw/rgw_sync_trace.h index 6db579ac4ceb4..9d5fb51b617f4 100644 --- a/src/rgw/rgw_sync_trace.h +++ b/src/rgw/rgw_sync_trace.h @@ -133,8 +133,8 @@ public: const std::string& id = ""); int hook_to_admin_command(); - bool call(std::string_view command, const cmdmap_t& cmdmap, - std::string_view format, bufferlist& out) override; + int call(std::string_view command, const cmdmap_t& cmdmap, + std::string_view format, bufferlist& out) override; string get_active_names(); }; diff --git a/src/rgw/services/svc_sys_obj_cache.cc b/src/rgw/services/svc_sys_obj_cache.cc index 6865eb70c45ff..bdbb67812aaca 100644 --- a/src/rgw/services/svc_sys_obj_cache.cc +++ b/src/rgw/services/svc_sys_obj_cache.cc @@ -517,8 +517,8 @@ public: int start(); void shutdown(); - bool call(std::string_view command, const cmdmap_t& cmdmap, - std::string_view format, bufferlist& out) override; + int call(std::string_view command, const cmdmap_t& cmdmap, + std::string_view format, bufferlist& out) override; }; int RGWSI_SysObj_Cache_ASocketHook::start() @@ -541,8 +541,9 @@ void RGWSI_SysObj_Cache_ASocketHook::shutdown() admin_socket->unregister_commands(this); } -bool RGWSI_SysObj_Cache_ASocketHook::call(std::string_view command, const cmdmap_t& cmdmap, - std::string_view format, bufferlist& out) +int RGWSI_SysObj_Cache_ASocketHook::call( + std::string_view command, const cmdmap_t& cmdmap, + std::string_view format, bufferlist& out) { if (command == "cache list"sv) { std::optional filter; @@ -555,10 +556,10 @@ bool RGWSI_SysObj_Cache_ASocketHook::call(std::string_view command, const cmdmap svc->asocket.call_list(filter, f.get()); f->close_section(); f->flush(out); - return true; + return 0; } else { out.append("Unable to create Formatter.\n"); - return false; + return -EINVAL; } } else if (command == "cache inspect"sv) { std::unique_ptr f(ceph::Formatter::create(format, "json-pretty")); @@ -566,28 +567,28 @@ bool RGWSI_SysObj_Cache_ASocketHook::call(std::string_view command, const cmdmap const auto& target = boost::get(cmdmap.at("target")); if (svc->asocket.call_inspect(target, f.get())) { f->flush(out); - return true; + return 0; } else { out.append("Unable to find entry "s + target + ".\n"); - return false; + return -ENOENT; } } else { out.append("Unable to create Formatter.\n"); - return false; + return -EINVAL; } } else if (command == "cache erase"sv) { const auto& target = boost::get(cmdmap.at("target")); if (svc->asocket.call_erase(target)) { - return true; + return 0; } else { out.append("Unable to find entry "s + target + ".\n"); - return false; + return -ENOENT; } } else if (command == "cache zap"sv) { svc->asocket.call_zap(); return true; } - return false; + return -ENOSYS; } RGWSI_SysObj_Cache::ASocketHandler::ASocketHandler(RGWSI_SysObj_Cache *_svc) : svc(_svc) diff --git a/src/test/admin_socket.cc b/src/test/admin_socket.cc index e213417589945..dfca141964e19 100644 --- a/src/test/admin_socket.cc +++ b/src/test/admin_socket.cc @@ -115,8 +115,8 @@ TEST(AdminSocket, SendTooLongRequest) { } class MyTest : public AdminSocketHook { - bool call(std::string_view command, const cmdmap_t& cmdmap, - std::string_view format, bufferlist& result) override { + int call(std::string_view command, const cmdmap_t& cmdmap, + std::string_view format, bufferlist& result) override { std::vector args; cmd_getval(g_ceph_context, cmdmap, "args", args); result.append(command); @@ -129,7 +129,7 @@ class MyTest : public AdminSocketHook { resultstr += *it; } result.append(resultstr); - return true; + return 0; } }; @@ -148,8 +148,8 @@ TEST(AdminSocket, RegisterCommand) { } class MyTest2 : public AdminSocketHook { - bool call(std::string_view command, const cmdmap_t& cmdmap, - std::string_view format, bufferlist& result) override { + int call(std::string_view command, const cmdmap_t& cmdmap, + std::string_view format, bufferlist& result) override { std::vector args; cmd_getval(g_ceph_context, cmdmap, "args", args); result.append(command); @@ -162,7 +162,7 @@ class MyTest2 : public AdminSocketHook { resultstr += *it; } result.append(resultstr); - return true; + return 0; } }; @@ -202,11 +202,11 @@ public: BlockingHook() = default; - bool call(std::string_view command, const cmdmap_t& cmdmap, - std::string_view format, bufferlist& result) override { + int call(std::string_view command, const cmdmap_t& cmdmap, + std::string_view format, bufferlist& result) override { std::unique_lock l{_lock}; _cond.wait(l); - return true; + return 0; } }; diff --git a/src/tools/rbd_mirror/ImageDeleter.cc b/src/tools/rbd_mirror/ImageDeleter.cc index 854769ebfe476..aa49e24aadc91 100644 --- a/src/tools/rbd_mirror/ImageDeleter.cc +++ b/src/tools/rbd_mirror/ImageDeleter.cc @@ -105,13 +105,13 @@ public: } } - bool call(std::string_view command, const cmdmap_t& cmdmap, - std::string_view format, bufferlist& out) override { + int call(std::string_view command, const cmdmap_t& cmdmap, + std::string_view format, bufferlist& out) override { Commands::const_iterator i = commands.find(command); ceph_assert(i != commands.end()); Formatter *f = Formatter::create(format); stringstream ss; - bool r = i->second->call(f, &ss); + int r = i->second->call(f, &ss); delete f; out.append(ss); return r; diff --git a/src/tools/rbd_mirror/ImageReplayer.cc b/src/tools/rbd_mirror/ImageReplayer.cc index e1a2551f42807..d87cb20f030ba 100644 --- a/src/tools/rbd_mirror/ImageReplayer.cc +++ b/src/tools/rbd_mirror/ImageReplayer.cc @@ -195,13 +195,13 @@ public: commands.clear(); } - bool call(std::string_view command, const cmdmap_t& cmdmap, - std::string_view format, bufferlist& out) override { + int call(std::string_view command, const cmdmap_t& cmdmap, + std::string_view format, bufferlist& out) override { auto i = commands.find(command); ceph_assert(i != commands.end()); Formatter *f = Formatter::create(format); stringstream ss; - bool r = i->second->call(f, &ss); + int r = i->second->call(f, &ss); delete f; out.append(ss); return r; diff --git a/src/tools/rbd_mirror/Mirror.cc b/src/tools/rbd_mirror/Mirror.cc index 2b580ffd157ce..980c6c713dbb5 100644 --- a/src/tools/rbd_mirror/Mirror.cc +++ b/src/tools/rbd_mirror/Mirror.cc @@ -321,13 +321,13 @@ public: } } - bool call(std::string_view command, const cmdmap_t& cmdmap, - std::string_view format, bufferlist& out) override { + int call(std::string_view command, const cmdmap_t& cmdmap, + std::string_view format, bufferlist& out) override { Commands::const_iterator i = commands.find(command); ceph_assert(i != commands.end()); Formatter *f = Formatter::create(format); stringstream ss; - bool r = i->second->call(f, &ss); + int r = i->second->call(f, &ss); delete f; out.append(ss); return r; diff --git a/src/tools/rbd_mirror/PoolReplayer.cc b/src/tools/rbd_mirror/PoolReplayer.cc index 6f6c80814d312..85afd0f0d1d07 100644 --- a/src/tools/rbd_mirror/PoolReplayer.cc +++ b/src/tools/rbd_mirror/PoolReplayer.cc @@ -185,13 +185,13 @@ public: } } - bool call(std::string_view command, const cmdmap_t& cmdmap, - std::string_view format, bufferlist& out) override { + int call(std::string_view command, const cmdmap_t& cmdmap, + std::string_view format, bufferlist& out) override { auto i = commands.find(command); ceph_assert(i != commands.end()); Formatter *f = Formatter::create(format); stringstream ss; - bool r = i->second->call(f, &ss); + int r = i->second->call(f, &ss); delete f; out.append(ss); return r; -- 2.39.5