if (is_reconnect())
server->reconnect_tick();
- if (is_clientreplay())
- maybe_clientreplay_done();
if (is_active()) {
balancer->tick();
return;
}
- if (replay_queue.empty() && !server->get_num_pending_reclaim())
+ if (replay_queue.empty() && !server->get_num_pending_reclaim()) {
request_state(MDSMap::STATE_ACTIVE);
- else
+ } else {
+ replaying_requests_done = replay_queue.empty();
request_state(MDSMap::STATE_CLIENTREPLAY);
+ }
}
void MDSRank::clientreplay_start()
replay_queue.pop_front();
return true;
}
- // don't go to active if there are session waiting for being reclaimed
- if (!server->get_num_pending_reclaim())
- mdlog->wait_for_safe(new C_MDS_VoidFn(this, &MDSRank::clientreplay_done));
+ if (!replaying_requests_done) {
+ replaying_requests_done = true;
+ mdlog->flush();
+ }
+ maybe_clientreplay_done();
return false;
}
void MDSRank::maybe_clientreplay_done()
{
- if (is_clientreplay() &&
- get_want_state() == MDSMap::STATE_CLIENTREPLAY &&
- replay_queue.empty()) {
- int num_requests = mdcache->get_num_client_requests();
- int num_reclaim = server->get_num_pending_reclaim();
- if (!num_requests && !num_reclaim) {
- clientreplay_done();
- } else {
- dout(1) << " still have " << num_requests << " active replay requests, "
- << num_reclaim << " sessions need to be reclaimed" << dendl;
+ if (is_clientreplay() && get_want_state() == MDSMap::STATE_CLIENTREPLAY) {
+
+ // don't go to active if there are session waiting for being reclaimed
+ if (replaying_requests_done && !server->get_num_pending_reclaim()) {
+ mdlog->wait_for_safe(new C_MDS_VoidFn(this, &MDSRank::clientreplay_done));
+ return;
}
+
+ dout(1) << " still have " << replay_queue.size() + (int)!replaying_requests_done
+ << " requests need to be replayed, " << server->get_num_pending_reclaim()
+ << " sessions need to be reclaimed" << dendl;
}
}
waiting_for_reconnect, waiting_for_resolve;
MDSContext::vec waiting_for_any_client_connection;
MDSContext::que replay_queue;
+ bool replaying_requests_done = false;
+
map<mds_rank_t, MDSContext::vec > waiting_for_active_peer;
map<epoch_t, MDSContext::vec > waiting_for_mdsmap;
if (mds->queue_one_replay()) {
dout(10) << " queued next replay op" << dendl;
} else {
- dout(10) << " journaled last replay op, flushing" << dendl;
- mdlog->flush();
+ dout(10) << " journaled last replay op" << dendl;
}
} else if (mdr->did_early_reply)
mds->locker->drop_rdlocks_for_early_reply(mdr.get());