]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
MDS: Convert the request_start* functions and their immediate callers
authorGreg Farnum <greg@inktank.com>
Sat, 8 Mar 2014 00:01:42 +0000 (16:01 -0800)
committerGreg Farnum <greg@inktank.com>
Fri, 4 Apr 2014 17:39:58 +0000 (10:39 -0700)
Also, the active_requests mapping gets weak pointers.

Signed-off-by: Greg Farnum <greg@inktank.com>
src/mds/MDCache.cc
src/mds/MDCache.h
src/mds/Migrator.cc
src/mds/Server.cc

index b75bab0b19fdfb330b41888e355c148f85db0cda..b61808adc3289c1e8a8ab208897f393d7ef4cff2 100644 (file)
@@ -4474,7 +4474,7 @@ void MDCache::handle_cache_rejoin_strong(MMDSCacheRejoin *strong)
          dout(10) << " dn authpin by " << *r << " on " << *dn << dendl;
 
          // get/create slave mdrequest
-         MDRequest *mdr;
+         MDRequestRef mdr;
          if (have_request(r->reqid))
            mdr = request_get(r->reqid);
          else
@@ -4569,7 +4569,7 @@ void MDCache::handle_cache_rejoin_strong(MMDSCacheRejoin *strong)
        dout(10) << " inode authpin by " << *r << " on " << *in << dendl;
 
        // get/create slave mdrequest
-       MDRequest *mdr;
+       MDRequestRef mdr;
        if (have_request(r->reqid))
          mdr = request_get(r->reqid);
        else
@@ -8838,11 +8838,11 @@ int MDCache::get_num_client_requests()
 }
 
 /* This function takes over the reference to the passed Message */
-MDRequest *MDCache::request_start(MClientRequest *req)
+MDRequestRef MDCache::request_start(MClientRequest *req)
 {
   // did we win a forward race against a slave?
   if (active_requests.count(req->get_reqid())) {
-    MDRequest *mdr = active_requests[req->get_reqid()];
+    MDRequestRef mdr = active_requests[req->get_reqid()];
     if (mdr->is_slave()) {
       dout(10) << "request_start already had " << *mdr << ", waiting for finish" << dendl;
       mdr->more()->waiting_for_finish.push_back(new C_MDS_RetryMessage(mds, req));
@@ -8850,28 +8850,29 @@ MDRequest *MDCache::request_start(MClientRequest *req)
       dout(10) << "request_start already processing " << *mdr << ", dropping new msg" << dendl;
       req->put();
     }
-    return 0;
+    return MDRequestRef();
   }
 
   // register new client request
-  MDRequest *mdr = new MDRequest(req->get_reqid(), req->get_num_fwd(), req);
+  MDRequestRef mdr(new MDRequestImpl(req->get_reqid(),
+                                     req->get_num_fwd(), req));
   active_requests[req->get_reqid()] = mdr;
   dout(7) << "request_start " << *mdr << dendl;
   return mdr;
 }
 
-MDRequest *MDCache::request_start_slave(metareqid_t ri, __u32 attempt, int by)
+MDRequestRef MDCache::request_start_slave(metareqid_t ri, __u32 attempt, int by)
 {
-  MDRequest *mdr = new MDRequest(ri, attempt, by);
+  MDRequestRef mdr(new MDRequestImpl(ri, attempt, by));
   assert(active_requests.count(mdr->reqid) == 0);
   active_requests[mdr->reqid] = mdr;
   dout(7) << "request_start_slave " << *mdr << " by mds." << by << dendl;
   return mdr;
 }
 
-MDRequest *MDCache::request_start_internal(int op)
+MDRequestRef MDCache::request_start_internal(int op)
 {
-  MDRequest *mdr = new MDRequest;
+  MDRequestRef mdr(new MDRequestImpl);
   mdr->reqid.name = entity_name_t::MDS(mds->get_nodeid());
   mdr->reqid.tid = mds->issue_tid();
   mdr->internal_op = op;
@@ -8883,14 +8884,14 @@ MDRequest *MDCache::request_start_internal(int op)
 }
 
 
-MDRequest *MDCache::request_get(metareqid_t rid)
+MDRequestRef MDCache::request_get(metareqid_t rid)
 {
   assert(active_requests.count(rid));
   dout(7) << "request_get " << rid << " " << *active_requests[rid] << dendl;
-  return active_requests[rid];
+  return active_requests[rid].lock();
 }
 
-void MDCache::request_finish(MDRequest *mdr)
+void MDCache::request_finish(MDRequestRef mdr)
 {
   dout(7) << "request_finish " << *mdr << dendl;
 
@@ -9045,7 +9046,6 @@ void MDCache::request_cleanup(MDRequest *mdr)
 
   // remove from map
   active_requests.erase(mdr->reqid);
-  mdr->put();
 
   // fail-safe!
   if (was_replay && active_requests.empty()) {
@@ -11517,7 +11517,7 @@ void MDCache::fragment_frozen(dirfrag_t basedirfrag, int r)
 
   info.has_frozen = true;
 
-  MDRequest *mdr = request_start_internal(CEPH_MDS_OP_FRAGMENTDIR);
+  MDRequestRef mdr = request_start_internal(CEPH_MDS_OP_FRAGMENTDIR);
   mdr->more()->fragment_base = basedirfrag;
   dispatch_fragment_dir(mdr);
 }
index 422b94d90b256cca115263f03687c3e679a703c2..0a7f0dbe3f733991f7760c2e2edc9d9613e0fa6d 100644 (file)
@@ -67,7 +67,7 @@ class MMDSFragmentNotify;
 class ESubtreeMap;
 
 struct Mutation;
-struct MDRequest;
+struct MDRequestImpl;
 struct MDSlaveUpdate;
 
 
@@ -240,14 +240,14 @@ protected:
 
   // -- requests --
 protected:
-  ceph::unordered_map<metareqid_t, MDRequest*> active_requests; 
+  ceph::unordered_map<metareqid_t,ceph::weak_ptr<MDRequestImpl> > active_requests;
 
 public:
   int get_num_client_requests();
 
-  MDRequest* request_start(MClientRequest *req);
-  MDRequest* request_start_slave(metareqid_t rid, __u32 attempt, int by);
-  MDRequest* request_start_internal(int op);
+  MDRequestRef request_start(MClientRequest *req);
+  MDRequestRef request_start_slave(metareqid_t rid, __u32 attempt, int by);
+  MDRequestRef request_start_internal(int op);
   bool have_request(metareqid_t rid) {
     return active_requests.count(rid);
   }
index 08cf06c00d2ddf33640bc15c487ced1978104765..05e8dce1a761cf747382ddc3b227a7727d95f813 100644 (file)
@@ -745,7 +745,7 @@ void Migrator::export_dir(CDir *dir, int dest)
   dir->auth_pin(this);
   dir->state_set(CDir::STATE_EXPORTING);
 
-  MDRequest *mdr = mds->mdcache->request_start_internal(CEPH_MDS_OP_EXPORTDIR);
+  MDRequestRef mdr = mds->mdcache->request_start_internal(CEPH_MDS_OP_EXPORTDIR);
   mdr->more()->export_dir = dir;
 
   assert(export_state.count(dir) == 0);
@@ -753,7 +753,7 @@ void Migrator::export_dir(CDir *dir, int dest)
   stat.state = EXPORT_LOCKING;
   stat.peer = dest;
   stat.tid = mdr->reqid.tid;
-  stat.mut = mdr;
+  stat.mut = mdr.get();
 
   dispatch_export_dir(mdr);
 }
index 986487f09c4fac6a4945a3336d1a8a3f5e2fbf2d..6c7da2389231c600c44b0ebb17d8941e36d92adf 100644 (file)
@@ -1152,8 +1152,8 @@ void Server::handle_client_request(MClientRequest *req)
   }
 
   // register + dispatch
-  MDRequest *mdr = mdcache->request_start(req);
-  if (mdr) {
+  MDRequestRef mdr = mdcache->request_start(req);
+  if (mdr.get()) {
     if (session) {
       mdr->session = session;
       session->requests.push_back(&mdr->item_session_request);
@@ -1171,7 +1171,7 @@ void Server::handle_client_request(MClientRequest *req)
     req->releases.clear();
   }
 
-  if (mdr)
+  if (mdr.get())
     dispatch_client_request(mdr);
   return;
 }
@@ -1327,7 +1327,7 @@ void Server::handle_slave_request(MMDSSlaveRequest *m)
   }
 
   // am i a new slave?
-  MDRequest *mdr = NULL;
+  MDRequestRef mdr;
   if (mdcache->have_request(m->get_reqid())) {
     // existing?
     mdr = mdcache->request_get(m->get_reqid());
@@ -1346,14 +1346,14 @@ void Server::handle_slave_request(MMDSSlaveRequest *m)
       dout(10) << "local request " << *mdr << " attempt " << mdr->attempt << " < " << m->get_attempt()
               << ", closing out" << dendl;
       mdcache->request_finish(mdr);
-      mdr = NULL;
+      mdr.reset();
     } else if (mdr->slave_to_mds != from) {
       dout(10) << "local request " << *mdr << " not slave to mds." << from << dendl;
       m->put();
       return;
     }
   }
-  if (!mdr) {
+  if (!mdr.get()) {
     // new?
     if (m->get_op() == MMDSSlaveRequest::OP_FINISH) {
       dout(10) << "missing slave request for " << m->get_reqid()