Commit 300e42a2 authored by Xiubo Li's avatar Xiubo Li Committed by Ilya Dryomov
Browse files

ceph: add session already open notify support

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: default avatarXiubo Li <xiubli@redhat.com>
Reviewed-by: default avatarJeff Layton <jlayton@kernel.org>
Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
parent 4868e537
Loading
Loading
Loading
Loading
+20 −5
Original line number Original line Diff line number Diff line
@@ -3540,11 +3540,26 @@ static void handle_session(struct ceph_mds_session *session,
	case CEPH_SESSION_OPEN:
	case CEPH_SESSION_OPEN:
		if (session->s_state == CEPH_MDS_SESSION_RECONNECTING)
		if (session->s_state == CEPH_MDS_SESSION_RECONNECTING)
			pr_info("mds%d reconnect success\n", session->s_mds);
			pr_info("mds%d reconnect success\n", session->s_mds);

		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_state = CEPH_MDS_SESSION_OPEN;
			session->s_features = features;
			session->s_features = features;
			renewed_caps(mdsc, session, 0);
			renewed_caps(mdsc, session, 0);
		if (test_bit(CEPHFS_FEATURE_METRIC_COLLECT, &session->s_features))
			if (test_bit(CEPHFS_FEATURE_METRIC_COLLECT,
				     &session->s_features))
				metric_schedule_delayed(&mdsc->metric);
				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;
		wake = 1;
		if (mdsc->stopping)
		if (mdsc->stopping)
			__close_session(mdsc, session);
			__close_session(mdsc, session);
+4 −1
Original line number Original line Diff line number Diff line
@@ -29,8 +29,10 @@ enum ceph_feature_type {
	CEPHFS_FEATURE_MULTI_RECONNECT,
	CEPHFS_FEATURE_MULTI_RECONNECT,
	CEPHFS_FEATURE_DELEG_INO,
	CEPHFS_FEATURE_DELEG_INO,
	CEPHFS_FEATURE_METRIC_COLLECT,
	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 {	\
#define CEPHFS_FEATURES_CLIENT_SUPPORTED {	\
@@ -41,6 +43,7 @@ enum ceph_feature_type {
	CEPHFS_FEATURE_MULTI_RECONNECT,		\
	CEPHFS_FEATURE_MULTI_RECONNECT,		\
	CEPHFS_FEATURE_DELEG_INO,		\
	CEPHFS_FEATURE_DELEG_INO,		\
	CEPHFS_FEATURE_METRIC_COLLECT,		\
	CEPHFS_FEATURE_METRIC_COLLECT,		\
	CEPHFS_FEATURE_NOTIFY_SESSION_STATE,	\
}
}


/*
/*