From: Jos Collin Date: Fri, 8 Nov 2019 09:06:08 +0000 (+0530) Subject: mds: MMDSOp implementation and detect unversioned messages X-Git-Tag: v16.1.0~1909^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=946cc7a07acc20e3876de474c6c8793e70be0f4c;p=ceph.git mds: MMDSOp implementation and detect unversioned messages Fixes: https://tracker.ceph.com/issues/41565 Signed-off-by: Jos Collin --- diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc index d6839d5e640b..5f460a14b866 100644 --- a/src/mds/MDSRank.cc +++ b/src/mds/MDSRank.cc @@ -13,7 +13,7 @@ */ #include - +#include #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 &m) { - if (m->get_source().is_client()) { + if (m->get_source().is_mds()) { + const Message *msg = m.get(); + const MMDSOp *op = dynamic_cast(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(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 index 000000000000..4dc6edb3c5e0 --- /dev/null +++ b/src/messages/MMDSOp.h @@ -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 + MMDSOp(Types&&... args) + : SafeMessage(std::forward(args)...) {} +};