session->con = messenger->get_connection(session->inst);
session->state = MetaSession::STATE_OPENING;
mds_sessions[mds] = session;
+
+ // Maybe skip sending a request to open if this MDS daemon
+ // has previously sent us a REJECT.
+ if (rejected_by_mds.count(mds)) {
+ if (rejected_by_mds[mds] == session->inst) {
+ ldout(cct, 4) << "_open_mds_session mds." << mds << " skipping "
+ "because we were rejected" << dendl;
+ return session;
+ } else {
+ ldout(cct, 4) << "_open_mds_session mds." << mds << " old inst "
+ "rejected us, trying with new inst" << dendl;
+ rejected_by_mds.erase(mds);
+ }
+ }
+
MClientSession *m = new MClientSession(CEPH_SESSION_REQUEST_OPEN);
m->client_meta = metadata;
session->con->send_message(m);
force_session_readonly(session);
break;
+ case CEPH_SESSION_REJECT:
+ rejected_by_mds[session->mds_num] = session->inst;
+ _closed_mds_session(session);
+
+ break;
+
default:
assert(0);
}
bool mounted;
bool unmounting;
+ // When an MDS has sent us a REJECT, remember that and don't
+ // contact it again. Remember which inst rejected us, so that
+ // when we talk to another inst with the same rank we can
+ // try again.
+ std::map<mds_rank_t, entity_inst_t> rejected_by_mds;
+
int local_osd;
epoch_t local_osd_epoch;