From: Venky Shankar Date: Mon, 16 Oct 2023 04:11:19 +0000 (-0400) Subject: client: always refresh mds feature bits on session open X-Git-Tag: v17.2.8~552^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=65069f3612d934021906d5002a43752a13a582cb;p=ceph.git 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 quincy, the client would close the mds session if it has missing features - adjust the code due to that. --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 47d4ab6b5c347..56c4b8ca5a165 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -2331,6 +2331,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()); @@ -2349,6 +2355,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; } /* @@ -2367,8 +2380,7 @@ void Client::handle_client_session(const MConstRef& m) _closed_mds_session(session.get(), -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.get(), m); renew_caps(session.get()); session->state = MetaSession::STATE_OPEN;