]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: MMDSOp implementation and detect unversioned messages
authorJos Collin <jcollin@redhat.com>
Fri, 8 Nov 2019 09:06:08 +0000 (14:36 +0530)
committerJos Collin <jcollin@redhat.com>
Tue, 23 Jun 2020 06:09:05 +0000 (11:39 +0530)
Fixes: https://tracker.ceph.com/issues/41565
Signed-off-by: Jos Collin <jcollin@redhat.com>
src/mds/MDSRank.cc
src/messages/MMDSOp.h [new file with mode: 0644]

index d6839d5e640b742618553365b34ff1b0a41e5f51..5f460a14b866b8bf3cfb38d4fd00c305ed04044b 100644 (file)
@@ -13,7 +13,7 @@
  */
 
 #include <string_view>
-
+#include <typeinfo>
 #include "common/debug.h"
 #include "common/errno.h"
 #include "common/async/blocked_completion.h"
@@ -1008,7 +1008,14 @@ void MDSRank::ProgressThread::shutdown()
 
 bool MDSRankDispatcher::ms_dispatch(const cref_t<Message> &m)
 {
-  if (m->get_source().is_client()) {
+  if (m->get_source().is_mds()) {
+    const Message *msg = m.get();
+    const MMDSOp *op = dynamic_cast<const MMDSOp*>(msg);
+    if (!op)
+      dout(0) << typeid(*msg).name() << " is not an MMDSOp type" << dendl;
+    ceph_assert(op);
+  }
+  else if (m->get_source().is_client()) {
     Session *session = static_cast<Session*>(m->get_connection()->get_priv().get());
     if (session)
       session->last_seen = Session::clock::now();
diff --git a/src/messages/MMDSOp.h b/src/messages/MMDSOp.h
new file mode 100644 (file)
index 0000000..4dc6edb
--- /dev/null
@@ -0,0 +1,15 @@
+#pragma once
+
+#include "msg/Message.h"
+
+/*
+ * MMDSOp is used to ensure that all incoming MDS-MDS
+ * messages in MDSRankDispatcher are versioned. Therefore
+ * all MDS-MDS messages must be of type MMDSOp.
+ */
+class MMDSOp: public SafeMessage {
+public:
+  template<typename... Types>
+  MMDSOp(Types&&... args)
+    : SafeMessage(std::forward<Types>(args)...) {}
+};