On Thu, 2022-05-26 at 14:06 +0800, Xiubo Li wrote: > 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. > > URL: https://tracker.ceph.com/issues/53911 > Signed-off-by: Xiubo Li <xiubli@xxxxxxxxxx> > --- > fs/ceph/mds_client.c | 25 ++++++++++++++++++++----- > fs/ceph/mds_client.h | 5 ++++- > 2 files changed, 24 insertions(+), 6 deletions(-) > > diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c > index 4ced8d1e18ba..3e528b89b77a 100644 > --- a/fs/ceph/mds_client.c > +++ b/fs/ceph/mds_client.c > @@ -3569,11 +3569,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_info("mds%d already opened\n", session->s_mds); Does the above pr_info actually help anything? What will the admin do with this info? I'd probably just skip this since this is sort of expected to happen from time to time. > + } 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); > diff --git a/fs/ceph/mds_client.h b/fs/ceph/mds_client.h > index d8ec2ac93da3..256e3eada6c1 100644 > --- a/fs/ceph/mds_client.h > +++ b/fs/ceph/mds_client.h > @@ -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, \ > } > > /* The rest looks OK though. -- Jeff Layton <jlayton@xxxxxxxxxx>