return;
}
- if (replay_queue.empty())
+ if (replay_queue.empty()) {
request_state(MDSMap::STATE_ACTIVE);
- else
+ } else {
+ replaying_requests_done = replay_queue.empty();
request_state(MDSMap::STATE_CLIENTREPLAY);
+ }
}
void MDSRank::clientreplay_start()
bool MDSRank::queue_one_replay()
{
- if (replay_queue.empty()) {
- mdlog->wait_for_safe(new C_MDS_VoidFn(this, &MDSRank::clientreplay_done));
- return false;
+ if (!replay_queue.empty()) {
+ queue_waiter(replay_queue.front());
+ replay_queue.pop_front();
+ return true;
+ }
+ 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) {
+ if (replaying_requests_done) {
+ 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, " << dendl;
}
- queue_waiter(replay_queue.front());
- replay_queue.pop_front();
- return true;
}
void MDSRank::clientreplay_done()
waiting_for_reconnect, waiting_for_resolve;
list<MDSInternalContextBase*> waiting_for_any_client_connection;
list<MDSInternalContextBase*> replay_queue;
+ bool replaying_requests_done = false;
+
map<mds_rank_t, list<MDSInternalContextBase*> > waiting_for_active_peer;
map<epoch_t, list<MDSInternalContextBase*> > waiting_for_mdsmap;
}
bool queue_one_replay();
+ void maybe_clientreplay_done();
void set_osd_epoch_barrier(epoch_t e);
epoch_t get_osd_epoch_barrier() const {return osd_epoch_barrier;}
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());