From 798cb2c306ec648d10cf14296de28f903df27e9d Mon Sep 17 00:00:00 2001 From: Venky Shankar Date: Mon, 16 Oct 2023 00:11:19 -0400 Subject: [PATCH] client: always refresh mds feature bits on session open Fixes: http://tracker.ceph.com/issues/63188 Signed-off-by: Venky Shankar (cherry picked from commit 167fdd22e38d9febef8d7e0969403261314e3c98) Conflicts: src/client/Client.cc In pacific, the client would close the mds session if it has missing features - adjust the code due to that. Also adjust for `session` variable in Client::handle_client_session() as in pacific its of type MetaSession* rather than MetaSesssionRef. --- src/client/Client.cc | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 1944e6081a0..70d5aec7397 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -2322,6 +2322,12 @@ void Client::_closed_mds_session(MetaSession *s, int err, bool rejected) mds_sessions.erase(s->mds_num); } +static void reinit_mds_features(MetaSession *session, + const MConstRef& m) { + session->mds_features = std::move(m->supported_features); + session->mds_metric_flags = std::move(m->metric_spec.metric_flags); +} + void Client::handle_client_session(const MConstRef& m) { mds_rank_t from = mds_rank_t(m->get_source().num()); @@ -2340,6 +2346,13 @@ void Client::handle_client_session(const MConstRef& m) if (session->state == MetaSession::STATE_OPEN) { ldout(cct, 10) << "mds." << from << " already opened, ignore it" << dendl; + // The MDS could send a client_session(open) message even when + // the session state is STATE_OPEN. Normally, its fine to + // ignore this message, but, if the MDS sent this message just + // after it got upgraded, the MDS feature bits could differ + // than the one before the upgrade - so, refresh the feature + // bits the client holds. + reinit_mds_features(session, m); return; } /* @@ -2358,8 +2371,7 @@ void Client::handle_client_session(const MConstRef& m) _closed_mds_session(session, -CEPHFS_EPERM, true); break; } - session->mds_features = std::move(m->supported_features); - session->mds_metric_flags = std::move(m->metric_spec.metric_flags); + reinit_mds_features(session, m); renew_caps(session); session->state = MetaSession::STATE_OPEN; -- 2.47.3