switch (m->get_op()) {
case CEPH_SESSION_OPEN:
{
+ if (session->state == MetaSession::STATE_OPEN) {
+ ldout(cct, 10) << "mds." << from << " already opened, ignore it"
+ << dendl;
+ return;
+ }
+ /*
+ * The connection maybe broken and the session in client side
+ * has been reinitialized, need to update the seq anyway.
+ */
+ if (!session->seq && m->get_seq())
+ session->seq = m->get_seq();
+
feature_bitset_t missing_features(CEPHFS_FEATURES_CLIENT_REQUIRED);
missing_features -= m->supported_features;
if (!missing_features.empty()) {
session->is_stale() ||
session->is_killing() ||
terminating_sessions) {
- dout(10) << "currently open|opening|stale|killing, dropping this req" << dendl;
+ if (m->supported_features.test(CEPHFS_FEATURE_NOTIFY_SESSION_STATE)) {
+ if (session->is_open() && !mds->is_stopping()) {
+ dout(10) << "currently already opened" << dendl;
+
+ auto reply = make_message<MClientSession>(CEPH_SESSION_OPEN,
+ session->get_push_seq());
+ if (session->info.has_feature(CEPHFS_FEATURE_MIMIC))
+ reply->supported_features = supported_features;
+ mds->send_message_client(reply, session);
+ if (mdcache->is_readonly()) {
+ auto m = make_message<MClientSession>(CEPH_SESSION_FORCE_RO);
+ mds->send_message_client(m, session);
+ }
+ }
+ }
+ dout(10) << "currently " << session->get_state_name()
+ << ", dropping this req" << dendl;
return;
}
ceph_assert(session->is_closed() || session->is_closing());
#define CEPHFS_CURRENT_RELEASE CEPH_RELEASE_PACIFIC
// The first 5 bits are reserved for old ceph releases.
-#define CEPHFS_FEATURE_JEWEL 5
-#define CEPHFS_FEATURE_KRAKEN 6
-#define CEPHFS_FEATURE_LUMINOUS 7
-#define CEPHFS_FEATURE_MIMIC 8
-#define CEPHFS_FEATURE_REPLY_ENCODING 9
-#define CEPHFS_FEATURE_RECLAIM_CLIENT 10
-#define CEPHFS_FEATURE_LAZY_CAP_WANTED 11
-#define CEPHFS_FEATURE_MULTI_RECONNECT 12
-#define CEPHFS_FEATURE_NAUTILUS 12
-#define CEPHFS_FEATURE_DELEG_INO 13
-#define CEPHFS_FEATURE_OCTOPUS 13
-#define CEPHFS_FEATURE_METRIC_COLLECT 14
-#define CEPHFS_FEATURE_ALTERNATE_NAME 15
-#define CEPHFS_FEATURE_MAX 15
+#define CEPHFS_FEATURE_JEWEL 5
+#define CEPHFS_FEATURE_KRAKEN 6
+#define CEPHFS_FEATURE_LUMINOUS 7
+#define CEPHFS_FEATURE_MIMIC 8
+#define CEPHFS_FEATURE_REPLY_ENCODING 9
+#define CEPHFS_FEATURE_RECLAIM_CLIENT 10
+#define CEPHFS_FEATURE_LAZY_CAP_WANTED 11
+#define CEPHFS_FEATURE_MULTI_RECONNECT 12
+#define CEPHFS_FEATURE_NAUTILUS 12
+#define CEPHFS_FEATURE_DELEG_INO 13
+#define CEPHFS_FEATURE_OCTOPUS 13
+#define CEPHFS_FEATURE_METRIC_COLLECT 14
+#define CEPHFS_FEATURE_ALTERNATE_NAME 15
+#define CEPHFS_FEATURE_NOTIFY_SESSION_STATE 16
+#define CEPHFS_FEATURE_MAX 16
#define CEPHFS_FEATURES_ALL { \
0, 1, 2, 3, 4, \
CEPHFS_FEATURE_OCTOPUS, \
CEPHFS_FEATURE_METRIC_COLLECT, \
CEPHFS_FEATURE_ALTERNATE_NAME, \
+ CEPHFS_FEATURE_NOTIFY_SESSION_STATE, \
}
#define CEPHFS_METRIC_FEATURES_ALL { \