]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ceph: add session already open notify support
authorXiubo Li <xiubli@redhat.com>
Thu, 26 May 2022 05:21:31 +0000 (13:21 +0800)
committerIlya Dryomov <idryomov@gmail.com>
Tue, 2 Aug 2022 22:54:12 +0000 (00:54 +0200)
If the connection was accidently closed due to the socket issue or
something else the clients will try to open the opened sessions, the
MDSes will send the session open reply one more time if the clients
support the notify feature.

When the clients retry to open the sessions the s_seq will be 0 as
default, we need to update it anyway.

Link: https://tracker.ceph.com/issues/53911
Signed-off-by: Xiubo Li <xiubli@redhat.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
fs/ceph/mds_client.c
fs/ceph/mds_client.h

index f6da80d110dca0de940acce92d0f95b6a135a840..9cfa7b775fdb36e16b7881e9065c5aae6cf67582 100644 (file)
@@ -3540,11 +3540,26 @@ static void handle_session(struct ceph_mds_session *session,
        case CEPH_SESSION_OPEN:
                if (session->s_state == CEPH_MDS_SESSION_RECONNECTING)
                        pr_info("mds%d reconnect success\n", session->s_mds);
-               session->s_state = CEPH_MDS_SESSION_OPEN;
-               session->s_features = features;
-               renewed_caps(mdsc, session, 0);
-               if (test_bit(CEPHFS_FEATURE_METRIC_COLLECT, &session->s_features))
-                       metric_schedule_delayed(&mdsc->metric);
+
+               if (session->s_state == CEPH_MDS_SESSION_OPEN) {
+                       pr_notice("mds%d is already opened\n", session->s_mds);
+               } else {
+                       session->s_state = CEPH_MDS_SESSION_OPEN;
+                       session->s_features = features;
+                       renewed_caps(mdsc, session, 0);
+                       if (test_bit(CEPHFS_FEATURE_METRIC_COLLECT,
+                                    &session->s_features))
+                               metric_schedule_delayed(&mdsc->metric);
+               }
+
+               /*
+                * The connection maybe broken and the session in client
+                * side has been reinitialized, need to update the seq
+                * anyway.
+                */
+               if (!session->s_seq && seq)
+                       session->s_seq = seq;
+
                wake = 1;
                if (mdsc->stopping)
                        __close_session(mdsc, session);
index d8ec2ac93da328b0a017a2346ebf192fa28d3cb8..256e3eada6c12600b35f9c7bec5a3fabe7b14c98 100644 (file)
@@ -29,8 +29,10 @@ enum ceph_feature_type {
        CEPHFS_FEATURE_MULTI_RECONNECT,
        CEPHFS_FEATURE_DELEG_INO,
        CEPHFS_FEATURE_METRIC_COLLECT,
+       CEPHFS_FEATURE_ALTERNATE_NAME,
+       CEPHFS_FEATURE_NOTIFY_SESSION_STATE,
 
-       CEPHFS_FEATURE_MAX = CEPHFS_FEATURE_METRIC_COLLECT,
+       CEPHFS_FEATURE_MAX = CEPHFS_FEATURE_NOTIFY_SESSION_STATE,
 };
 
 #define CEPHFS_FEATURES_CLIENT_SUPPORTED {     \
@@ -41,6 +43,7 @@ enum ceph_feature_type {
        CEPHFS_FEATURE_MULTI_RECONNECT,         \
        CEPHFS_FEATURE_DELEG_INO,               \
        CEPHFS_FEATURE_METRIC_COLLECT,          \
+       CEPHFS_FEATURE_NOTIFY_SESSION_STATE,    \
 }
 
 /*