{
dout(1) << "reconnect_start" << dendl;
server->reconnect_clients();
+ finish_contexts(waiting_for_reconnect);
}
void MDS::reconnect_done()
{
int state; // my confirmed state
int want_state; // the state i want
- list<Context*> waiting_for_active, waiting_for_replay;
+ list<Context*> waiting_for_active, waiting_for_replay, waiting_for_reconnect;
list<Context*> replay_queue;
map<int, list<Context*> > waiting_for_active_peer;
list<Context*> waiting_for_nolaggy;
void wait_for_replay(Context *c) {
waiting_for_replay.push_back(c);
}
+ void wait_for_reconnect(Context *c) {
+ waiting_for_reconnect.push_back(c);
+ }
void enqueue_replay(Context *c) {
replay_queue.push_back(c);
}
int get_state() { return state; }
+ int get_want_state() { return want_state; }
bool is_creating() { return state == MDSMap::STATE_CREATING; }
bool is_starting() { return state == MDSMap::STATE_STARTING; }
bool is_standby() { return state == MDSMap::STATE_STANDBY; }
// active?
if (!mds->is_active() &&
!(mds->is_stopping() && m->get_orig_source().is_mds())) {
- if (mds->is_reconnect() &&
+ if ((mds->is_reconnect() || mds->get_want_state() == CEPH_MDS_STATE_RECONNECT) &&
m->get_type() == CEPH_MSG_CLIENT_REQUEST &&
((MClientRequest*)m)->is_replay()) {
dout(3) << "queuing replayed op" << dendl;
int from = m->get_source().num();
Session *session = get_session(m);
+ if (!mds->is_reconnect() && mds->get_want_state() == CEPH_MDS_STATE_RECONNECT) {
+ dout(10) << " we're almost in reconnect state (mdsmap delivery race?); waiting" << dendl;
+ mds->wait_for_reconnect(new C_MDS_RetryMessage(mds, m));
+ return;
+ }
if (!mds->is_reconnect() || !session) {
stringstream ss;
utime_t delay = g_clock.now();