if (active_requests.count(req->get_reqid())) {
MDRequest *mdr = active_requests[req->get_reqid()];
if (mdr->is_slave()) {
- dout(10) << "request_start already had " << *mdr << ", forward new msg" << dendl;
- mds->forward_message_mds(req, mdr->slave_to_mds);
+ dout(10) << "request_start already had " << *mdr << ", waiting for finish" << dendl;
+ mdr->more()->waiting_for_finish.push_back(new C_MDS_RetryMessage(mds, req));
} else {
dout(10) << "request_start already processing " << *mdr << ", dropping new msg" << dendl;
req->put();
{
dout(15) << "request_cleanup " << *mdr << dendl;
- if (mdr->has_more() && mdr->more()->is_ambiguous_auth)
- mdr->clear_ambiguous_auth();
+ if (mdr->has_more()) {
+ if (mdr->more()->is_ambiguous_auth)
+ mdr->clear_ambiguous_auth();
+ if (!mdr->more()->waiting_for_finish.empty())
+ mds->queue_waiters(mdr->more()->waiting_for_finish);
+ }
request_drop_locks(mdr);
Context *slave_commit;
bufferlist rollback_bl;
+ list<Context*> waiting_for_finish;
+
More() :
srcdn_auth_mds(-1),
src_reanchor_atid(0), dst_reanchor_atid(0), inode_import_v(0),
session->trim_completed_requests(req->get_oldest_client_tid());
}
- // request_start may drop the request, get a reference for cap release
- if (!req->releases.empty() && req->get_source().is_client() && !req->is_replay())
- req->get();
-
// register + dispatch
MDRequest *mdr = mdcache->request_start(req);
if (mdr) {
p != req->releases.end();
++p)
mds->locker->process_request_cap_release(mdr, client, p->item, p->dname);
- req->put();
+ req->releases.clear();
}
if (mdr)