From: Yan, Zheng Date: Sun, 17 Nov 2013 09:03:29 +0000 (+0800) Subject: mds: waiting for slave reuqest to finish X-Git-Tag: v0.75~93^2~19 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e6c4d32e64f32dd3c7fe93be453fa6bd0eefa7ce;p=ceph.git mds: waiting for slave reuqest to finish If MDS receives a client request, but find there is an existing slave request. It's possible that other MDS forwarded the request to us, but the MMDSSlaveRequest::OP_FINISH message arrives after the client request. Signed-off-by: Yan, Zheng --- diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 3468b2a40894..37963779416e 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -8589,8 +8589,8 @@ MDRequest *MDCache::request_start(MClientRequest *req) 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(); @@ -8748,8 +8748,12 @@ void MDCache::request_cleanup(MDRequest *mdr) { 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); diff --git a/src/mds/Mutation.h b/src/mds/Mutation.h index b50a03cefa42..3d6963b5561e 100644 --- a/src/mds/Mutation.h +++ b/src/mds/Mutation.h @@ -234,6 +234,8 @@ struct MDRequest : public Mutation { Context *slave_commit; bufferlist rollback_bl; + list waiting_for_finish; + More() : srcdn_auth_mds(-1), src_reanchor_atid(0), dst_reanchor_atid(0), inode_import_v(0), diff --git a/src/mds/Server.cc b/src/mds/Server.cc index e4ae599ac3e4..193cddb007c4 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -1118,10 +1118,6 @@ void Server::handle_client_request(MClientRequest *req) 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) { @@ -1139,7 +1135,7 @@ void Server::handle_client_request(MClientRequest *req) p != req->releases.end(); ++p) mds->locker->process_request_cap_release(mdr, client, p->item, p->dname); - req->put(); + req->releases.clear(); } if (mdr)