From bd52d8ca34d40b564ce7264479e6bad4a5975b9f Mon Sep 17 00:00:00 2001 From: Patrick Donnelly Date: Fri, 24 May 2024 16:52:35 -0400 Subject: [PATCH] common/admin_socket: create type for finisher callback And change second argument to std::string_view to have more flexible conversions. Signed-off-by: Patrick Donnelly --- src/common/admin_finisher.h | 21 +++++++++++++++++++++ src/common/admin_socket.cc | 10 +++++----- src/common/admin_socket.h | 7 +++++-- src/mds/MDSDaemon.cc | 4 ++-- src/mds/MDSDaemon.h | 2 +- src/mds/MDSRank.cc | 8 ++++---- src/mds/MDSRank.h | 10 +++++----- src/mds/MDSRankQuiesce.cc | 4 ++-- src/messages/MMonCommandAck.h | 4 ++-- src/osd/OSD.cc | 6 +++--- src/osd/OSD.h | 5 +++-- src/osd/PG.h | 3 ++- src/osd/PrimaryLogPG.cc | 4 ++-- src/osd/PrimaryLogPG.h | 5 +++-- 14 files changed, 60 insertions(+), 33 deletions(-) create mode 100644 src/common/admin_finisher.h diff --git a/src/common/admin_finisher.h b/src/common/admin_finisher.h new file mode 100644 index 0000000000000..f087b5edf474f --- /dev/null +++ b/src/common/admin_finisher.h @@ -0,0 +1,21 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +/* + * Ceph - scalable distributed file system + * + * Copyright (C) 2024 IBM, Inc. + * + * This is free software; you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License version 2.1, as published by + * the Free Software Foundation. See file COPYING. + */ + +#pragma once + +#include +#include + +#include "include/buffer.h" + +typedef std::function asok_finisher; diff --git a/src/common/admin_socket.cc b/src/common/admin_socket.cc index 78eb8e45eb3a4..1e73ce0836a92 100644 --- a/src/common/admin_socket.cc +++ b/src/common/admin_socket.cc @@ -425,7 +425,7 @@ void AdminSocket::do_tell_queue() execute_command( m->cmd, m->get_data(), - [m](int r, const std::string& err, bufferlist& outbl) { + [m](int r, std::string_view err, bufferlist& outbl) { auto reply = new MCommandReply(r, err); reply->set_tid(m->get_tid()); reply->set_data(outbl); @@ -441,7 +441,7 @@ void AdminSocket::do_tell_queue() execute_command( m->cmd, m->get_data(), - [m](int r, const std::string& err, bufferlist& outbl) { + [m](int r, std::string_view err, bufferlist& outbl) { auto reply = new MMonCommandAck(m->cmd, r, err, 0); reply->set_tid(m->get_tid()); reply->set_data(outbl); @@ -472,7 +472,7 @@ int AdminSocket::execute_command( execute_command( cmd, inbl, - [&errss, outbl, &fin](int r, const std::string& err, bufferlist& out) { + [&errss, outbl, &fin](int r, std::string_view err, bufferlist& out) { errss << err; *outbl = std::move(out); fin.finish(r); @@ -488,7 +488,7 @@ int AdminSocket::execute_command( void AdminSocket::execute_command( const std::vector& cmdvec, const bufferlist& inbl, - std::function on_finish) + asok_finisher on_finish) { cmdmap_t cmdmap; string format; @@ -565,7 +565,7 @@ void AdminSocket::execute_command( hook->call_async( prefix, cmdmap, f, inbl, - [f, output, on_finish, m_cct=m_cct](int r, const std::string& err, bufferlist& out) { + [f, output, on_finish, m_cct=m_cct](int r, std::string_view err, bufferlist& out) { // handle either existing output in bufferlist *or* via formatter ldout(m_cct, 10) << __func__ << ": command completed with result " << r << dendl; if (auto* jff = dynamic_cast(f); jff != nullptr) { diff --git a/src/common/admin_socket.h b/src/common/admin_socket.h index b95a52af7bebc..4e2f26834666c 100644 --- a/src/common/admin_socket.h +++ b/src/common/admin_socket.h @@ -27,6 +27,7 @@ #include "include/buffer.h" #include "include/common_fwd.h" +#include "common/admin_finisher.h" #include "common/ref.h" #include "common/cmdparse.h" @@ -35,6 +36,8 @@ class MMonCommand; inline constexpr auto CEPH_ADMIN_SOCK_VERSION = std::string_view("2"); +typedef std::function asok_finisher; + class AdminSocketHook { public: /** @@ -93,7 +96,7 @@ public: const cmdmap_t& cmdmap, ceph::Formatter *f, const ceph::buffer::list& inbl, - std::function on_finish) { + asok_finisher on_finish) { // by default, call the synchronous handler and then finish ceph::buffer::list out; std::ostringstream errss; @@ -151,7 +154,7 @@ public: void execute_command( const std::vector& cmd, const ceph::buffer::list& inbl, - std::function on_fin); + asok_finisher on_fin); /// execute (blocking) int execute_command( diff --git a/src/mds/MDSDaemon.cc b/src/mds/MDSDaemon.cc index 09b7b5da5513e..206daf9d5d8b3 100644 --- a/src/mds/MDSDaemon.cc +++ b/src/mds/MDSDaemon.cc @@ -127,7 +127,7 @@ public: const cmdmap_t& cmdmap, Formatter *f, const bufferlist& inbl, - std::function on_finish) override { + asok_finisher on_finish) override { mds->asok_command(command, cmdmap, f, inbl, on_finish); } }; @@ -137,7 +137,7 @@ void MDSDaemon::asok_command( const cmdmap_t& cmdmap, Formatter *f, const bufferlist& inbl, - std::function on_finish) + asok_finisher on_finish) { dout(1) << "asok_command: " << command << " " << cmdmap << " (starting...)" << dendl; diff --git a/src/mds/MDSDaemon.h b/src/mds/MDSDaemon.h index e7929d2c37dec..7f357abdfdd7c 100644 --- a/src/mds/MDSDaemon.h +++ b/src/mds/MDSDaemon.h @@ -101,7 +101,7 @@ class MDSDaemon : public Dispatcher { const cmdmap_t& cmdmap, Formatter *f, const bufferlist &inbl, - std::function on_finish); + asok_finisher on_finish); void dump_status(Formatter *f); diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc index 6ed7ee34dd5ef..10f01c9843eb2 100644 --- a/src/mds/MDSRank.cc +++ b/src/mds/MDSRank.cc @@ -2651,7 +2651,7 @@ void MDSRankDispatcher::handle_asok_command( const cmdmap_t& cmdmap, Formatter *f, const bufferlist &inbl, - std::function on_finish) + asok_finisher on_finish) { int r = 0; CachedStackStringStream css; @@ -3090,7 +3090,7 @@ out: */ void MDSRankDispatcher::evict_clients( const SessionFilter &filter, - std::function on_finish) + asok_finisher on_finish) { bufferlist outbl; if (is_any_replay()) { @@ -3473,7 +3473,7 @@ public: std::function finish_once; }; -void MDSRank::command_quiesce_path(Formatter* f, const cmdmap_t& cmdmap, std::function on_finish) +void MDSRank::command_quiesce_path(Formatter* f, const cmdmap_t& cmdmap, asok_finisher on_finish) { std::string path; if (!cmd_getval(cmdmap, "path", path)) { @@ -3515,7 +3515,7 @@ void MDSRank::command_quiesce_path(Formatter* f, const cmdmap_t& cmdmap, std::fu } } -void MDSRank::command_lock_path(Formatter* f, const cmdmap_t& cmdmap, std::function on_finish) +void MDSRank::command_lock_path(Formatter* f, const cmdmap_t& cmdmap, asok_finisher on_finish) { std::string path; diff --git a/src/mds/MDSRank.h b/src/mds/MDSRank.h index 3dfda80ee6907..9ea6ddd96d13b 100644 --- a/src/mds/MDSRank.h +++ b/src/mds/MDSRank.h @@ -526,12 +526,12 @@ class MDSRank { std::ostream &ss); void command_openfiles_ls(Formatter *f); void command_dump_tree(const cmdmap_t &cmdmap, std::ostream &ss, Formatter *f); - void command_quiesce_path(Formatter *f, const cmdmap_t &cmdmap, std::function on_finish); - void command_lock_path(Formatter* f, const cmdmap_t& cmdmap, std::function on_finish); + void command_quiesce_path(Formatter *f, const cmdmap_t &cmdmap, asok_finisher on_finish); + void command_lock_path(Formatter* f, const cmdmap_t& cmdmap, asok_finisher on_finish); void command_dump_inode(Formatter *f, const cmdmap_t &cmdmap, std::ostream &ss); void command_dump_dir(Formatter *f, const cmdmap_t &cmdmap, std::ostream &ss); void command_cache_drop(uint64_t timeout, Formatter *f, Context *on_finish); - void command_quiesce_db(const cmdmap_t& cmdmap, std::function on_finish); + void command_quiesce_db(const cmdmap_t& cmdmap, asok_finisher on_finish); // FIXME the state machine logic should be separable from the dispatch // logic that calls it. @@ -725,7 +725,7 @@ public: const cmdmap_t& cmdmap, Formatter *f, const bufferlist &inbl, - std::function on_finish); + asok_finisher on_finish); void handle_mds_map(const cref_t &m, const MDSMap &oldmap); void handle_osd_map(); void update_log_config(); @@ -735,7 +735,7 @@ public: void dump_sessions(const SessionFilter &filter, Formatter *f, bool cap_dump=false) const; void evict_clients(const SessionFilter &filter, - std::function on_finish); + asok_finisher on_finish); // Call into me from MDS::ms_dispatch bool ms_dispatch(const cref_t &m); diff --git a/src/mds/MDSRankQuiesce.cc b/src/mds/MDSRankQuiesce.cc index 0262cee63f44e..0ad49b396d6a8 100644 --- a/src/mds/MDSRankQuiesce.cc +++ b/src/mds/MDSRankQuiesce.cc @@ -45,7 +45,7 @@ } \ while (0) -void MDSRank::command_quiesce_db(const cmdmap_t& cmdmap, std::function on_finish) +void MDSRank::command_quiesce_db(const cmdmap_t& cmdmap, asok_finisher on_finish) { // validate the command: using ceph::common::cmd_getval; @@ -111,7 +111,7 @@ void MDSRank::command_quiesce_db(const cmdmap_t& cmdmap, std::function on_finish; + asok_finisher on_finish; bool all = false; mds_gid_t me; diff --git a/src/messages/MMonCommandAck.h b/src/messages/MMonCommandAck.h index bf96bcc639cd3..8de1095295500 100644 --- a/src/messages/MMonCommandAck.h +++ b/src/messages/MMonCommandAck.h @@ -27,9 +27,9 @@ public: std::string rs; MMonCommandAck() : PaxosServiceMessage{MSG_MON_COMMAND_ACK, 0} {} - MMonCommandAck(const std::vector& c, int _r, std::string s, version_t v) : + MMonCommandAck(const std::vector& c, int _r, auto&& s, version_t v) : PaxosServiceMessage{MSG_MON_COMMAND_ACK, v}, - cmd(c), r(_r), rs(s) { } + cmd(c), r(_r), rs(std::forward(s)) { } private: ~MMonCommandAck() final {} diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 38fa99f352623..7dcebe83b5a13 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -2598,7 +2598,7 @@ public: const cmdmap_t& cmdmap, Formatter *f, const bufferlist& inbl, - std::function on_finish) override { + asok_finisher on_finish) override { try { osd->asok_command(prefix, cmdmap, f, inbl, on_finish); } catch (const TOPNSPC::common::bad_cmd_get& e) { @@ -2660,7 +2660,7 @@ int OSD::asok_route_to_pg( stringstream& ss, const bufferlist& inbl, bufferlist& outbl, - std::function on_finish) + asok_finisher on_finish) { auto [target_pg, ret] = locate_asok_target(cmdmap, ss, only_primary); @@ -2687,7 +2687,7 @@ void OSD::asok_command( std::string_view prefix, const cmdmap_t& cmdmap, Formatter *f, const bufferlist& inbl, - std::function on_finish) + asok_finisher on_finish) { int ret = 0; stringstream ss; // stderr error message stream diff --git a/src/osd/OSD.h b/src/osd/OSD.h index 6cebf169ff98e..c762f14c462fa 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -19,6 +19,7 @@ #include "msg/Dispatcher.h" +#include "common/admin_finisher.h" #include "common/async/context_pool.h" #include "common/Timer.h" #include "common/WorkQueue.h" @@ -1124,13 +1125,13 @@ protected: std::stringstream& ss, const bufferlist& inbl, bufferlist& outbl, - std::function on_finish); + asok_finisher on_finish); void asok_command( std::string_view prefix, const cmdmap_t& cmdmap, ceph::Formatter *f, const ceph::buffer::list& inbl, - std::function on_finish); + asok_finisher on_finish); public: int get_nodeid() { return whoami; } diff --git a/src/osd/PG.h b/src/osd/PG.h index 83a37f8533a1f..dc0276ffaa623 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -20,6 +20,7 @@ #include "include/mempool.h" // re-include our assert to clobber boost's +#include "common/admin_finisher.h" #include "include/ceph_assert.h" #include "include/common_fwd.h" @@ -764,7 +765,7 @@ public: std::string_view prefix, const cmdmap_t& cmdmap, const ceph::buffer::list& idata, - std::function on_finish) = 0; + asok_finisher on_finish) = 0; virtual bool agent_work(int max) = 0; virtual bool agent_work(int max, int agent_flush_quota) = 0; diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index 1dc991ea8ce61..a7e6d90a8fe10 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -1015,7 +1015,7 @@ void PrimaryLogPG::do_command( string_view orig_prefix, const cmdmap_t& cmdmap, const bufferlist& idata, - std::function on_finish) + asok_finisher on_finish) { string format; cmd_getval(cmdmap, "format", format); @@ -12718,7 +12718,7 @@ void PrimaryLogPG::do_update_log_missing_reply(OpRequestRef &op) */ void PrimaryLogPG::mark_all_unfound_lost( int what, - std::function on_finish) + asok_finisher on_finish) { dout(3) << __func__ << " " << pg_log_entry_t::get_op_name(what) << dendl; list oids; diff --git a/src/osd/PrimaryLogPG.h b/src/osd/PrimaryLogPG.h index 74981df2b916d..323b66e02a7be 100644 --- a/src/osd/PrimaryLogPG.h +++ b/src/osd/PrimaryLogPG.h @@ -25,6 +25,7 @@ #include "Watch.h" #include "TierAgentState.h" #include "messages/MOSDOpReply.h" +#include "common/admin_finisher.h" #include "common/Checksummer.h" #include "common/sharedptr_registry.hpp" #include "common/shared_cache.hpp" @@ -1500,7 +1501,7 @@ public: std::string_view prefix, const cmdmap_t& cmdmap, const ceph::buffer::list& idata, - std::function on_finish) override; + asok_finisher on_finish) override; void clear_cache() override; int get_cache_obj_count() override { @@ -1894,7 +1895,7 @@ public: void mark_all_unfound_lost( int what, - std::function on_finish); + asok_finisher on_finish); eversion_t pick_newest_available(const hobject_t& oid); void do_update_log_missing( -- 2.39.5