From: Sage Weil Date: Tue, 13 Mar 2018 17:19:42 +0000 (-0500) Subject: mgr/DaemonServer: handle MMgrClose X-Git-Tag: v13.1.0~142^2~2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=8b3b2fa392c703431f5f0e6a1e6e0b6cfd821b5f;p=ceph.git mgr/DaemonServer: handle MMgrClose Close will close out an open mgr session (unwind MMgrOpen). Signed-off-by: Sage Weil --- diff --git a/src/messages/MMgrClose.h b/src/messages/MMgrClose.h new file mode 100644 index 0000000000000..3692b3bb9e71a --- /dev/null +++ b/src/messages/MMgrClose.h @@ -0,0 +1,45 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#pragma once + +#include "msg/Message.h" + +class MMgrClose : public Message +{ + static const int HEAD_VERSION = 1; + static const int COMPAT_VERSION = 1; + +public: + std::string daemon_name; + std::string service_name; // optional; otherwise infer from entity type + + void decode_payload() override + { + bufferlist::iterator p = payload.begin(); + decode(daemon_name, p); + decode(service_name, p); + } + + void encode_payload(uint64_t features) override { + using ceph::encode; + encode(daemon_name, payload); + encode(service_name, payload); + } + + const char *get_type_name() const override { return "mgrclose"; } + void print(ostream& out) const override { + out << get_type_name() << "("; + if (service_name.length()) { + out << service_name; + } else { + out << ceph_entity_type_name(get_source().type()); + } + out << "." << daemon_name; + out << ")"; + } + + MMgrClose() + : Message(MSG_MGR_CLOSE, HEAD_VERSION, COMPAT_VERSION) + {} +}; diff --git a/src/mgr/DaemonServer.cc b/src/mgr/DaemonServer.cc index 700347ebbafa4..3e4a5377d3aa3 100644 --- a/src/mgr/DaemonServer.cc +++ b/src/mgr/DaemonServer.cc @@ -24,6 +24,7 @@ #include "mon/MonCommand.h" #include "messages/MMgrOpen.h" +#include "messages/MMgrClose.h" #include "messages/MMgrConfigure.h" #include "messages/MMonMgrReport.h" #include "messages/MCommand.h" @@ -284,6 +285,8 @@ bool DaemonServer::ms_dispatch(Message *m) return handle_report(static_cast(m)); case MSG_MGR_OPEN: return handle_open(static_cast(m)); + case MSG_MGR_CLOSE: + return handle_close(static_cast(m)); case MSG_COMMAND: return handle_command(static_cast(m)); default: @@ -417,6 +420,37 @@ bool DaemonServer::handle_open(MMgrOpen *m) return true; } +bool DaemonServer::handle_close(MMgrClose *m) +{ + Mutex::Locker l(lock); + + DaemonKey key; + if (!m->service_name.empty()) { + key.first = m->service_name; + } else { + key.first = ceph_entity_type_name(m->get_connection()->get_peer_type()); + } + key.second = m->daemon_name; + + dout(4) << "from " << m->get_connection() << " " << key << dendl; + + if (daemon_state.exists(key)) { + DaemonStatePtr daemon = daemon_state.get(key); + daemon_state.rm(key); + { + Mutex::Locker l(daemon->lock); + if (daemon->service_daemon) { + pending_service_map.rm_daemon(m->service_name, m->daemon_name); + pending_service_map_dirty = pending_service_map.epoch; + } + } + } + + // send same message back as a reply + m->get_connection()->send_message(m); + return true; +} + bool DaemonServer::handle_report(MMgrReport *m) { DaemonKey key; diff --git a/src/mgr/DaemonServer.h b/src/mgr/DaemonServer.h index 6a01714c4f010..7972a1d84763b 100644 --- a/src/mgr/DaemonServer.h +++ b/src/mgr/DaemonServer.h @@ -33,6 +33,7 @@ class MMgrReport; class MMgrOpen; +class MMgrClose; class MMonMgrReport; class MCommand; struct MonCommand; @@ -132,6 +133,7 @@ public: CryptoKey& session_key) override; bool handle_open(MMgrOpen *m); + bool handle_close(MMgrClose *m); bool handle_report(MMgrReport *m); bool handle_command(MCommand *m); void send_report(); diff --git a/src/msg/Message.cc b/src/msg/Message.cc index 4df92e9fc07f3..13c314d4b471b 100644 --- a/src/msg/Message.cc +++ b/src/msg/Message.cc @@ -173,6 +173,7 @@ #include "messages/MMgrDigest.h" #include "messages/MMgrReport.h" #include "messages/MMgrOpen.h" +#include "messages/MMgrClose.h" #include "messages/MMgrConfigure.h" #include "messages/MMonMgrReport.h" #include "messages/MServiceMap.h" @@ -793,6 +794,10 @@ Message *decode_message(CephContext *cct, int crcflags, m = new MMgrOpen(); break; + case MSG_MGR_CLOSE: + m = new MMgrClose(); + break; + case MSG_MGR_REPORT: m = new MMgrReport(); break; diff --git a/src/msg/Message.h b/src/msg/Message.h index 7cde12cc6b9a7..d3be1efb988f1 100644 --- a/src/msg/Message.h +++ b/src/msg/Message.h @@ -212,6 +212,8 @@ #define MSG_MON_MGR_REPORT 0x706 #define MSG_SERVICE_MAP 0x707 +#define MSG_MGR_CLOSE 0x708 + // ====================================================== // abstract Message class