]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
common/admin_socket: create type for finisher callback
authorPatrick Donnelly <pdonnell@redhat.com>
Fri, 24 May 2024 20:52:35 +0000 (16:52 -0400)
committerPatrick Donnelly <pdonnell@redhat.com>
Thu, 27 Jun 2024 16:25:07 +0000 (12:25 -0400)
And change second argument to std::string_view to have more flexible
conversions.

Signed-off-by: Patrick Donnelly <pdonnell@redhat.com>
(cherry picked from commit bd52d8ca34d40b564ce7264479e6bad4a5975b9f)

Conflicts:
src/common/admin_socket.cc

14 files changed:
src/common/admin_finisher.h [new file with mode: 0644]
src/common/admin_socket.cc
src/common/admin_socket.h
src/mds/MDSDaemon.cc
src/mds/MDSDaemon.h
src/mds/MDSRank.cc
src/mds/MDSRank.h
src/mds/MDSRankQuiesce.cc
src/messages/MMonCommandAck.h
src/osd/OSD.cc
src/osd/OSD.h
src/osd/PG.h
src/osd/PrimaryLogPG.cc
src/osd/PrimaryLogPG.h

diff --git a/src/common/admin_finisher.h b/src/common/admin_finisher.h
new file mode 100644 (file)
index 0000000..f087b5e
--- /dev/null
@@ -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 <functional>
+#include <string_view>
+
+#include "include/buffer.h"
+
+typedef std::function<void(int,std::string_view,ceph::buffer::list&)> asok_finisher;
index 343cb44141722da3c7280398a204de0458ed80fc..58ea36c86e8ac3a4308a82dd8cef80d20c333323 100644 (file)
@@ -423,7 +423,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);
@@ -439,7 +439,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);
@@ -470,7 +470,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);
@@ -486,7 +486,7 @@ int AdminSocket::execute_command(
 void AdminSocket::execute_command(
   const std::vector<std::string>& cmdvec,
   const bufferlist& inbl,
-  std::function<void(int,const std::string&,bufferlist&)> on_finish)
+  asok_finisher on_finish)
 {
   cmdmap_t cmdmap;
   string format;
@@ -524,7 +524,7 @@ void AdminSocket::execute_command(
 
   hook->call_async(
     prefix, cmdmap, f, inbl,
-    [f, on_finish](int r, const std::string& err, bufferlist& out) {
+    [f, on_finish](int r, std::string_view err, bufferlist& out) {
       // handle either existing output in bufferlist *or* via formatter
       if (r >= 0 && out.length() == 0) {
        f->flush(out);
index b95a52af7bebc2a630cc3e2ce7b44a20d92dc7a3..4e2f26834666c3e2ed76973a0d47d1f200d85be9 100644 (file)
@@ -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<void(int,std::string_view,ceph::buffer::list&)> asok_finisher;
+
 class AdminSocketHook {
 public:
   /**
@@ -93,7 +96,7 @@ public:
     const cmdmap_t& cmdmap,
     ceph::Formatter *f,
     const ceph::buffer::list& inbl,
-    std::function<void(int,const std::string&,ceph::buffer::list&)> 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<std::string>& cmd,
     const ceph::buffer::list& inbl,
-    std::function<void(int,const std::string&,ceph::buffer::list&)> on_fin);
+    asok_finisher on_fin);
 
   /// execute (blocking)
   int execute_command(
index 09b7b5da5513e29966117ca84cfc2a385a0e234a..206daf9d5d8b33dcf341216e979c3209fb227cdb 100644 (file)
@@ -127,7 +127,7 @@ public:
     const cmdmap_t& cmdmap,
     Formatter *f,
     const bufferlist& inbl,
-    std::function<void(int,const std::string&,bufferlist&)> 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<void(int,const std::string&,bufferlist&)> on_finish)
+  asok_finisher on_finish)
 {
   dout(1) << "asok_command: " << command << " " << cmdmap
          << " (starting...)" << dendl;
index e7929d2c37deccd23ffa3fa271ae85cd62082937..7f357abdfdd7caa533b58d480e94d8488439729b 100644 (file)
@@ -101,7 +101,7 @@ class MDSDaemon : public Dispatcher {
     const cmdmap_t& cmdmap,
     Formatter *f,
     const bufferlist &inbl,
-    std::function<void(int,const std::string&,bufferlist&)> on_finish);
+    asok_finisher on_finish);
 
   void dump_status(Formatter *f);
 
index 759295a78a4d1727b1f1aab27748f7072fb0a6a2..b33f0fce47e2a92d9b1cee3f55fa5dfd371c7320 100644 (file)
@@ -2651,7 +2651,7 @@ void MDSRankDispatcher::handle_asok_command(
   const cmdmap_t& cmdmap,
   Formatter *f,
   const bufferlist &inbl,
-  std::function<void(int,const std::string&,bufferlist&)> 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<void(int,const std::string&,bufferlist&)> on_finish)
+  asok_finisher on_finish)
 {
   bufferlist outbl;
   if (is_any_replay()) {
@@ -3473,7 +3473,7 @@ public:
   std::function<void(int, C_MDS_QuiescePathCommand const&)> finish_once;
 };
 
-void MDSRank::command_quiesce_path(Formatter* f, const cmdmap_t& cmdmap, std::function<void(int, const std::string&, bufferlist&)> 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<void(int, const std::string&, bufferlist&)> on_finish)
+void MDSRank::command_lock_path(Formatter* f, const cmdmap_t& cmdmap, asok_finisher on_finish)
 {
   std::string path;
 
index 3dfda80ee690720cde3b0fef22fb42d6c5ca78bf..9ea6ddd96d13b0e3587775def8decf4862810d04 100644 (file)
@@ -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<void(int, const std::string&, bufferlist&)> on_finish);
-    void command_lock_path(Formatter* f, const cmdmap_t& cmdmap, std::function<void(int, const std::string&, bufferlist&)> 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<void(int, const std::string&, bufferlist&)> 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<void(int,const std::string&,bufferlist&)> on_finish);
+    asok_finisher on_finish);
   void handle_mds_map(const cref_t<MMDSMap> &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<void(int,const std::string&,bufferlist&)> on_finish);
+                    asok_finisher on_finish);
 
   // Call into me from MDS::ms_dispatch
   bool ms_dispatch(const cref_t<Message> &m);
index 4727d137f628a2486779a6be31416c076fd1904b..0071cd8fa5990afa557c7032ff0b27110ac76295 100644 (file)
@@ -45,7 +45,7 @@
   }           \
   while (0)
 
-void MDSRank::command_quiesce_db(const cmdmap_t& cmdmap, std::function<void(int, const std::string&, bufferlist&)> 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<void(int,
   }
 
   struct Ctx : public QuiesceDbManager::RequestContext {
-    std::function<void(int, const std::string&, bufferlist&)> on_finish;
+    asok_finisher on_finish;
     bool all = false;
     mds_gid_t me;
 
index bf96bcc639cd3108512223873d23f30af4417c3a..8de1095295500c89fab0edb1c60782faf4c03d24 100644 (file)
@@ -27,9 +27,9 @@ public:
   std::string rs;
 
   MMonCommandAck() : PaxosServiceMessage{MSG_MON_COMMAND_ACK, 0} {}
-  MMonCommandAck(const std::vector<std::string>& c, int _r, std::string s, version_t v) :
+  MMonCommandAck(const std::vector<std::string>& 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<decltype(s)>(s)) { }
 private:
   ~MMonCommandAck() final {}
 
index e740958a074fd15c4c916bb3765dec3871c19fdd..38bd475cce37f5e8b6cb69f513d8d5b2671c5e7d 100644 (file)
@@ -2587,7 +2587,7 @@ public:
     const cmdmap_t& cmdmap,
     Formatter *f,
     const bufferlist& inbl,
-    std::function<void(int,const std::string&,bufferlist&)> 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) {
@@ -2649,7 +2649,7 @@ int OSD::asok_route_to_pg(
   stringstream& ss,
   const bufferlist& inbl,
   bufferlist& outbl,
-  std::function<void(int, const std::string&, bufferlist&)> on_finish)
+  asok_finisher on_finish)
 {
   auto [target_pg, ret] = locate_asok_target(cmdmap, ss, only_primary);
 
@@ -2676,7 +2676,7 @@ void OSD::asok_command(
   std::string_view prefix, const cmdmap_t& cmdmap,
   Formatter *f,
   const bufferlist& inbl,
-  std::function<void(int,const std::string&,bufferlist&)> on_finish)
+  asok_finisher on_finish)
 {
   int ret = 0;
   stringstream ss;   // stderr error message stream
index b294aba7e0f02ff66cd85a4a3a86f50236185121..579d463560f10dff3fabf2026f8bb9f924c26724 100644 (file)
@@ -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"
@@ -1123,13 +1124,13 @@ protected:
     std::stringstream& ss,
     const bufferlist& inbl,
     bufferlist& outbl,
-    std::function<void(int, const std::string&, bufferlist&)> 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<void(int,const std::string&,ceph::buffer::list&)> on_finish);
+    asok_finisher on_finish);
 
 public:
   int get_nodeid() { return whoami; }
index 9abf92e90855a52544d672f5da73a038c3b77890..18337eddea21e6f8ad62b8e98ce6715a0d0558be 100644 (file)
@@ -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<void(int,const std::string&,ceph::buffer::list&)> 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;
index 3d1aa3802890fa1a981f142f2951bf9673505607..6b9010177f44a65482a3d94ee67452beee388b1e 100644 (file)
@@ -1001,7 +1001,7 @@ void PrimaryLogPG::do_command(
   string_view orig_prefix,
   const cmdmap_t& cmdmap,
   const bufferlist& idata,
-  std::function<void(int,const std::string&,bufferlist&)> on_finish)
+  asok_finisher on_finish)
 {
   string format;
   cmd_getval(cmdmap, "format", format);
@@ -12635,7 +12635,7 @@ void PrimaryLogPG::do_update_log_missing_reply(OpRequestRef &op)
  */
 void PrimaryLogPG::mark_all_unfound_lost(
   int what,
-  std::function<void(int,const std::string&,bufferlist&)> on_finish)
+  asok_finisher on_finish)
 {
   dout(3) << __func__ << " " << pg_log_entry_t::get_op_name(what) << dendl;
   list<hobject_t> oids;
index 85849bb85b93c4a3632271223016634433c7a8b1..2402f78e5567a73aad0107283d08855a27c03f81 100644 (file)
@@ -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"
@@ -1499,7 +1500,7 @@ public:
     std::string_view prefix,
     const cmdmap_t& cmdmap,
     const ceph::buffer::list& idata,
-    std::function<void(int,const std::string&,ceph::buffer::list&)> on_finish) override;
+    asok_finisher on_finish) override;
 
   void clear_cache() override;
   int get_cache_obj_count() override {
@@ -1891,7 +1892,7 @@ public:
 
   void mark_all_unfound_lost(
     int what,
-    std::function<void(int,const std::string&,ceph::buffer::list&)> on_finish);
+    asok_finisher on_finish);
   eversion_t pick_newest_available(const hobject_t& oid);
 
   void do_update_log_missing(