]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: always refresh mds feature bits on session open 54244/head
authorVenky Shankar <vshankar@redhat.com>
Mon, 16 Oct 2023 04:11:19 +0000 (00:11 -0400)
committerVenky Shankar <vshankar@redhat.com>
Mon, 30 Oct 2023 11:09:59 +0000 (16:39 +0530)
Fixes: http://tracker.ceph.com/issues/63188
Signed-off-by: Venky Shankar <vshankar@redhat.com>
(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.

src/client/Client.cc

index 47d4ab6b5c34756a28d889b1ae9a6b2ab16ca5c4..56c4b8ca5a165d192146b36b9e506baaa6694b20 100644 (file)
@@ -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<MClientSession>& 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<MClientSession>& m)
 {
   mds_rank_t from = mds_rank_t(m->get_source().num());
@@ -2349,6 +2355,13 @@ void Client::handle_client_session(const MConstRef<MClientSession>& 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<MClientSession>& 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;