]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: waiting for slave reuqest to finish
authorYan, Zheng <zheng.z.yan@intel.com>
Sun, 17 Nov 2013 09:03:29 +0000 (17:03 +0800)
committerYan, Zheng <zheng.z.yan@intel.com>
Mon, 16 Dec 2013 04:15:24 +0000 (12:15 +0800)
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 <zheng.z.yan@intel.com>
src/mds/MDCache.cc
src/mds/Mutation.h
src/mds/Server.cc

index 3468b2a40894ac0762ea056ae51927b2961bb0dc..37963779416ea978d247f5a0797c3d29de87acdb 100644 (file)
@@ -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);
 
index b50a03cefa424a1b25bef8b769f8a62033a78fa8..3d6963b5561e48dd9200efd5a690f1611d8eadb4 100644 (file)
@@ -234,6 +234,8 @@ struct MDRequest : public Mutation {
     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),
index e4ae599ac3e48efa50e99a460e5868dd45436001..193cddb007c4f17c62e85073f8bd932446adc80e 100644 (file)
@@ -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)