MDSRank::queue_one_replay() does not create active request
immediately, it just queues corresponding C_MDS_RetryMessage
for execution. So the fail-safe code can queue an extra replay
request. This can cause replay requests be processed out-of-order
Fixes: http://tracker.ceph.com/issues/17271
Signed-off-by: Yan, Zheng <zyan@redhat.com>
// remove from map
active_requests.erase(mdr->reqid);
- // fail-safe!
- if (was_replay && active_requests.empty()) {
- dout(10) << " fail-safe queueing next replay op" << dendl;
- mds->queue_one_replay();
- }
-
if (mds->logger)
log_stat();
bool MDSRank::queue_one_replay()
{
if (replay_queue.empty()) {
- if (mdcache->get_num_client_requests() == 0) {
- clientreplay_done();
- }
+ clientreplay_done();
return false;
}
queue_waiter(replay_queue.front());
void Server::journal_and_reply(MDRequestRef& mdr, CInode *in, CDentry *dn, LogEvent *le, MDSInternalContextBase *fin)
{
dout(10) << "journal_and_reply tracei " << in << " tracedn " << dn << dendl;
+ assert(!mdr->has_completed);
// note trace items for eventual reply.
mdr->tracei = in;