From: Marcel Lauhoff Date: Wed, 21 Aug 2024 13:38:22 +0000 (+0200) Subject: msg: Add connection and messenger dump() X-Git-Tag: v20.3.0~373^2~7 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2176ec2766f941059bada23dee3320c7408741f5;p=ceph.git msg: Add connection and messenger dump() Signed-off-by: Marcel Lauhoff --- diff --git a/src/msg/Messenger.h b/src/msg/Messenger.h index 078418fe715f..a1a1c48d3dc5 100644 --- a/src/msg/Messenger.h +++ b/src/msg/Messenger.h @@ -28,6 +28,7 @@ #include "Message.h" #include "Dispatcher.h" #include "Policy.h" +#include "common/Formatter.h" #include "common/Throttle.h" #include "include/Context.h" #include "include/types.h" @@ -521,6 +522,8 @@ public: * @} // Startup/Shutdown */ + virtual void dump(Formatter* f) = 0; + /** * @defgroup Messaging * @{ diff --git a/src/msg/async/AsyncConnection.cc b/src/msg/async/AsyncConnection.cc index ab3d454748e3..49a41b489286 100644 --- a/src/msg/async/AsyncConnection.cc +++ b/src/msg/async/AsyncConnection.cc @@ -14,9 +14,15 @@ * */ +#include #include +#include "common/ceph_strings.h" +#include "common/ceph_time.h" +#include "common/iso_8601.h" +#include "common/tcp_info.h" #include "include/Context.h" +#include "include/msgr.h" #include "include/random.h" #include "common/errno.h" #include "AsyncMessenger.h" @@ -810,3 +816,61 @@ void AsyncConnection::tick(uint64_t id) } } } + +void AsyncConnection::dump(Formatter *f) { + std::lock_guard l(lock); + + f->open_object_section("async_connection"); + f->dump_string("state", get_state_name(state)); + f->dump_unsigned("messenger_nonce", async_msgr->get_nonce()); + + f->open_object_section("status"); + f->dump_bool("connected", is_connected()); + f->dump_bool("loopback", is_loopback); + f->close_section(); // status + + if (cs) { + f->dump_int("socket_fd", cs.fd()); + if (!dump_tcp_info(cs.fd(), f)) { + f->dump_null("tcp_info"); + } + } else { + f->dump_null("socket_fd"); + f->dump_null("tcp_info"); + } + f->dump_int("conn_id", conn_id); + + f->open_object_section("peer"); + f->dump_object("entity_name", get_peer_entity_name()); + f->dump_string("type", ceph_entity_type_name(get_peer_type())); + f->dump_int("id", get_peer_id()); + f->dump_int("global_id", get_peer_global_id()); + f->open_object_section("addr"); + peer_addrs->dump(f); + f->close_section(); // addr + f->close_section(); // peer + + f->dump_string("last_connect_started_ago", + ceph::timespan_str(ceph::coarse_mono_clock::now() - + last_connect_started)); + f->dump_string( + "last_active_ago", + fmt::format("{}", ceph::timespan_str(ceph::coarse_mono_clock::now() - + last_active))); + f->dump_string("recv_start_time_ago", + fmt::format("{}", ceph::timespan_str(ceph::mono_clock::now() - + recv_start_time))); + f->dump_unsigned("last_tick_id", last_tick_id); + f->dump_object("socket_addr", socket_addr); + f->dump_object("target_addr", target_addr); + f->dump_int("port", port); + f->open_object_section("protocol"); + if (protocol) { + protocol->dump(f); + } else { + f->dump_null("null"); + } + f->close_section(); // protocol + f->dump_int("worker_id", worker ? worker->id : -1); + f->close_section(); // async_connection +} diff --git a/src/msg/async/AsyncConnection.h b/src/msg/async/AsyncConnection.h index a4f18e2c4fb5..614af9189c24 100644 --- a/src/msg/async/AsyncConnection.h +++ b/src/msg/async/AsyncConnection.h @@ -243,6 +243,8 @@ private: bool is_msgr2() const override; + void dump(Formatter* f); + friend class Protocol; friend class ProtocolV1; friend class ProtocolV2; diff --git a/src/msg/async/AsyncMessenger.cc b/src/msg/async/AsyncMessenger.cc index 6b3a8c3f6dcd..2533128d6d1f 100644 --- a/src/msg/async/AsyncMessenger.cc +++ b/src/msg/async/AsyncMessenger.cc @@ -20,7 +20,10 @@ #include #include "AsyncMessenger.h" +#include +#include "common/Clock.h" +#include "common/Formatter.h" #include "common/config.h" #include "common/Timer.h" #include "common/errno.h" @@ -357,6 +360,72 @@ int AsyncMessenger::shutdown() return 0; } +void AsyncMessenger::dump(Formatter* f) { + std::lock_guard l{lock}; + f->dump_unsigned("nonce", nonce); + f->open_object_section("my_name"); + my_name.dump(f); + f->close_section(); // my_name + f->open_object_section("my_addrs"); + my_addrs->dump(f); + f->close_section(); // my_addrs + + f->open_array_section("listen_sockets"); + for (const auto& proc : processors) { + for (const auto& sock : proc->listen_sockets) { + f->open_object_section("socket"); + f->dump_int("socket_fd", sock.fd()); + + f->dump_int("worker_id", proc->worker ? proc->worker->id : -1); + f->close_section(); // socket + } + } + f->close_section(); // listen_sockets + + f->open_object_section("dispatch_queue"); + f->dump_int("length", get_dispatch_queue_len()); + utime_t dispatch_queue_max_age; + dispatch_queue_max_age.set_from_double( + get_dispatch_queue_max_age(ceph_clock_now())); + f->dump_string("max_age_ago", utimespan_str(dispatch_queue_max_age)); + f->close_section(); // dispatch_queue + + f->dump_int("connections_count", conns.size()); + + f->open_array_section("connections"); + for (const auto& [e, c] : conns) { + f->open_object_section("connection"); + e.dump(f); + c->dump(f); + f->close_section(); // connection + } + f->close_section(); // connections + + f->open_array_section("anon_conns"); + for (const auto& c : anon_conns) { + c->dump(f); + } + f->close_section(); // anon_conns + + f->open_array_section("accepting_conns"); + for (const auto& c : accepting_conns) { + c->dump(f); + } + f->close_section(); + + f->open_array_section("deleted_conns"); + for (const auto& c : deleted_conns) { + c->dump(f); + } + f->close_section(); // deleted_conns + + if (local_connection) { + f->open_array_section("local_connection"); + local_connection->dump(f); + f->close_section(); // local_connection + } +} + int AsyncMessenger::bind(const entity_addr_t &bind_addr, std::optional public_addrs) { diff --git a/src/msg/async/AsyncMessenger.h b/src/msg/async/AsyncMessenger.h index 0a3227dec5d3..469399e8c74b 100644 --- a/src/msg/async/AsyncMessenger.h +++ b/src/msg/async/AsyncMessenger.h @@ -62,6 +62,7 @@ class Processor { entity_addrvec_t* bound_addrs); void start(); void accept(); + friend class AsyncMessenger; }; /* @@ -136,6 +137,8 @@ public: void wait() override; int shutdown() override; + void dump(Formatter* f) override; + /** @} // Startup/Shutdown */ /**