From 167fdd22e38d9febef8d7e0969403261314e3c98 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 --- 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 b7c645abe3cba..7d223018c7621 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -2384,6 +2384,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()); @@ -2402,6 +2408,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.get(), m); return; } /* @@ -2411,8 +2424,7 @@ void Client::handle_client_session(const MConstRef& m) if (!session->seq && m->get_seq()) session->seq = m->get_seq(); - session->mds_features = std::move(m->supported_features); - session->mds_metric_flags = std::move(m->metric_spec.metric_flags); + reinit_mds_features(session.get(), m); cap_auths = std::move(m->cap_auths); renew_caps(session.get());