]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/DaemonServer: handle MMgrClose
authorSage Weil <sage@redhat.com>
Tue, 13 Mar 2018 17:19:42 +0000 (12:19 -0500)
committerSage Weil <sage@redhat.com>
Fri, 13 Apr 2018 23:28:46 +0000 (18:28 -0500)
Close will close out an open mgr session (unwind MMgrOpen).

Signed-off-by: Sage Weil <sage@redhat.com>
src/messages/MMgrClose.h [new file with mode: 0644]
src/mgr/DaemonServer.cc
src/mgr/DaemonServer.h
src/msg/Message.cc
src/msg/Message.h

diff --git a/src/messages/MMgrClose.h b/src/messages/MMgrClose.h
new file mode 100644 (file)
index 0000000..3692b3b
--- /dev/null
@@ -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)
+  {}
+};
index 700347ebbafa4964e2ce70ba6791423ae40731db..3e4a5377d3aa354f97c053d875291cc03cde7b93 100644 (file)
@@ -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<MMgrReport*>(m));
     case MSG_MGR_OPEN:
       return handle_open(static_cast<MMgrOpen*>(m));
+    case MSG_MGR_CLOSE:
+      return handle_close(static_cast<MMgrClose*>(m));
     case MSG_COMMAND:
       return handle_command(static_cast<MCommand*>(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;
index 6a01714c4f010dd5bd42de48347a54b8390386b8..7972a1d84763bfa07b3c631eecbb4a28ddfd772e 100644 (file)
@@ -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();
index 4df92e9fc07f3dad4e6dda3ef980f975bcc561e4..13c314d4b471b3a5c1c76293cf09bdd286352b8d 100644 (file)
 #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;
index 7cde12cc6b9a72283209b88556fe6cdf8ca6952f..d3be1efb988f1a90f5fb3ce0d1e16da66f8e3869 100644 (file)
 #define MSG_MON_MGR_REPORT        0x706
 #define MSG_SERVICE_MAP           0x707
 
+#define MSG_MGR_CLOSE             0x708
+
 // ======================================================
 
 // abstract Message class