}
-void Client::check_mds_sessions()
-{
- for (map<int,MDSSession>::iterator p = mds_sessions.begin();
- p != mds_sessions.end();
- p++) {
- int mds = p->first;
- MDSSession &s = p->second;
- if (!s.requests.empty()) {
- const MDSMap::mds_info_t& info = mdsmap->get_mds_info(mds);
- for (set<int>::const_iterator q = info.export_targets.begin();
- q != info.export_targets.end();
- q++) {
- if (mds_sessions.count(*q) == 0 && waiting_for_session.count(mds) == 0) {
- dout(10) << "check_mds_sessions opening mds" << mds
- << " export target mds" << *q << dendl;
- messenger->send_message(new MClientSession(CEPH_SESSION_REQUEST_OPEN),
- mdsmap->get_inst(*q));
- waiting_for_session[*q].size();
- }
+void Client::connect_mds_targets(int mds)
+{
+ //this function shouldn't be called unless we lost a connection
+ assert (mds_sessions.count(mds));
+ MDSSession &s = mds_sessions[mds];
+ if (!s.requests.empty()) {
+ const MDSMap::mds_info_t& info = mdsmap->get_mds_info(mds);
+ for (set<int>::const_iterator q = info.export_targets.begin();
+ q != info.export_targets.end();
+ q++) {
+ if (mds_sessions.count(*q) == 0 && waiting_for_session.count(mds) == 0) {
+ dout(10) << "check_mds_sessions opening mds" << mds
+ << " export target mds" << *q << dendl;
+ messenger->send_message(new MClientSession(CEPH_SESSION_REQUEST_OPEN),
+ mdsmap->get_inst(*q));
+ waiting_for_session[*q].size();
}
}
- }
+ }
}
int Client::make_request(MetaRequest *request,
// send request.
send_request(request, mds);
- // make sure we have needed mds sessions open
- check_mds_sessions();
-
// wait for signal
dout(20) << "awaiting reply|forward|kick on " << &cond << dendl;
request->kick = false;
delete oldmap;
delete m;
- check_mds_sessions();
-
monclient->sub_got("mdsmap", mdsmap->get_epoch());
}
// reset my cap seq number
mds_sessions[mds].seq = 0;
+ //connect to the mds' offload targets
+ connect_mds_targets(mds);
+ //make sure unsafe requests get saved
resend_unsafe_requests(mds);
} else {
dout(10) << " i had no session with this mds" << dendl;
void encode_dentry_release(Dentry *dn, MClientRequest *req,
int mds, int drop, int unless);
int choose_target_mds(MetaRequest *req);
- void check_mds_sessions();
+ void connect_mds_targets(int mds);
void send_request(MetaRequest *request, int mds);
void kick_requests(int mds, bool signal);
void handle_client_request_forward(MClientRequestForward *reply);