--- /dev/null
+// -*- 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;
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);
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);
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);
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;
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<JSONFormatterFile*>(f); jff != nullptr) {
#include "include/buffer.h"
#include "include/common_fwd.h"
+#include "common/admin_finisher.h"
#include "common/ref.h"
#include "common/cmdparse.h"
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:
/**
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;
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(
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);
}
};
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;
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);
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;
*/
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()) {
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)) {
}
}
-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;
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.
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();
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);
} \
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;
}
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;
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 {}
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) {
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);
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
#include "msg/Dispatcher.h"
+#include "common/admin_finisher.h"
#include "common/async/context_pool.h"
#include "common/Timer.h"
#include "common/WorkQueue.h"
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; }
#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"
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;
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);
*/
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;
#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"
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 {
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(