]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: MDRequest: rename to MDRequestImpl, and declare MDRequestRef
authorGreg Farnum <greg@inktank.com>
Fri, 7 Mar 2014 23:58:11 +0000 (15:58 -0800)
committerGreg Farnum <greg@inktank.com>
Fri, 4 Apr 2014 17:39:58 +0000 (10:39 -0700)
We're switching the MDRequest to be used as a shared pointer. This is the
first step on the path to inserting an OpTracker into the MDS.
Give the MDRequestImpl a weak_ptr self_ref so that we can keep
using the elist for now.

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

index 0bf5475fae18ba7d0de96dd4bfa8b01379da6843..87ffc3ea5540b6cecbd9698d513eefc3563faf8c 100644 (file)
@@ -174,9 +174,9 @@ void Mutation::cleanup()
 }
 
 
-// MDRequest
+// MDRequestImpl
 
-MDRequest::~MDRequest()
+MDRequestImpl::~MDRequestImpl()
 {
   if (client_request)
     client_request->put();
@@ -185,34 +185,34 @@ MDRequest::~MDRequest()
   delete _more;
 }
 
-MDRequest::More* MDRequest::more()
+MDRequestImpl::More* MDRequestImpl::more()
 { 
   if (!_more)
     _more = new More();
   return _more;
 }
 
-bool MDRequest::has_more()
+bool MDRequestImpl::has_more()
 {
   return _more;
 }
 
-bool MDRequest::are_slaves()
+bool MDRequestImpl::are_slaves()
 {
   return _more && !_more->slaves.empty();
 }
 
-bool MDRequest::slave_did_prepare()
+bool MDRequestImpl::slave_did_prepare()
 {
   return more()->slave_commit;
 }
 
-bool MDRequest::did_ino_allocation()
+bool MDRequestImpl::did_ino_allocation()
 {
   return alloc_ino || used_prealloc_ino || prealloc_inos.size();
 }      
 
-bool MDRequest::freeze_auth_pin(CInode *inode)
+bool MDRequestImpl::freeze_auth_pin(CInode *inode)
 {
   assert(!more()->rename_inode || more()->rename_inode == inode);
   more()->rename_inode = inode;
@@ -226,7 +226,7 @@ bool MDRequest::freeze_auth_pin(CInode *inode)
   return true;
 }
 
-void MDRequest::unfreeze_auth_pin(bool clear_inode)
+void MDRequestImpl::unfreeze_auth_pin(bool clear_inode)
 {
   assert(more()->is_freeze_authpin);
   CInode *inode = more()->rename_inode;
@@ -239,14 +239,14 @@ void MDRequest::unfreeze_auth_pin(bool clear_inode)
     more()->rename_inode = NULL;
 }
 
-void MDRequest::set_remote_frozen_auth_pin(CInode *inode)
+void MDRequestImpl::set_remote_frozen_auth_pin(CInode *inode)
 {
   assert(!more()->rename_inode || more()->rename_inode == inode);
   more()->rename_inode = inode;
   more()->is_remote_frozen_authpin = true;
 }
 
-void MDRequest::set_ambiguous_auth(CInode *inode)
+void MDRequestImpl::set_ambiguous_auth(CInode *inode)
 {
   assert(!more()->rename_inode || more()->rename_inode == inode);
   assert(!more()->is_ambiguous_auth);
@@ -256,7 +256,7 @@ void MDRequest::set_ambiguous_auth(CInode *inode)
   more()->is_ambiguous_auth = true;
 }
 
-void MDRequest::clear_ambiguous_auth()
+void MDRequestImpl::clear_ambiguous_auth()
 {
   CInode *inode = more()->rename_inode;
   assert(inode && more()->is_ambiguous_auth);
@@ -264,7 +264,7 @@ void MDRequest::clear_ambiguous_auth()
   more()->is_ambiguous_auth = false;
 }
 
-bool MDRequest::can_auth_pin(MDSCacheObject *object)
+bool MDRequestImpl::can_auth_pin(MDSCacheObject *object)
 {
   return object->can_auth_pin() ||
          (is_auth_pinned(object) && has_more() &&
@@ -272,14 +272,14 @@ bool MDRequest::can_auth_pin(MDSCacheObject *object)
          more()->rename_inode == object);
 }
 
-void MDRequest::drop_local_auth_pins()
+void MDRequestImpl::drop_local_auth_pins()
 {
   if (has_more() && more()->is_freeze_authpin)
     unfreeze_auth_pin(true);
   Mutation::drop_local_auth_pins();
 }
 
-void MDRequest::print(ostream &out)
+void MDRequestImpl::print(ostream &out)
 {
   out << "request(" << reqid;
   //if (request) out << " " << *request;
index 206b71a9158dd1b772324845aef96d983559353f..0090641ca07f522a83646ad556783eb609da528e 100644 (file)
@@ -155,10 +155,10 @@ inline ostream& operator<<(ostream& out, Mutation &mut)
  * mostly information about locks held, so that we can drop them all
  * the request is finished or forwarded.  see request_*().
  */
-struct MDRequest : public Mutation {
-  int ref;
+struct MDRequestImpl : public Mutation {
+  ceph::weak_ptr<MDRequestImpl> self_ref;
   Session *session;
-  elist<MDRequest*>::item item_session_request;  // if not on list, op is aborted.
+  elist<MDRequestImpl*>::item item_session_request;  // if not on list, op is aborted.
 
   // -- i am a client (master) request
   MClientRequest *client_request; // client request (if any)
@@ -251,8 +251,8 @@ struct MDRequest : public Mutation {
 
 
   // ---------------------------------------------------
-  MDRequest() : 
-    ref(1),
+  MDRequestImpl() :
+    self_ref(),
     session(0), item_session_request(this),
     client_request(0), straydn(NULL), snapid(CEPH_NOSNAP), tracei(0), tracedn(0),
     alloc_ino(0), used_prealloc_ino(0), snap_caps(0), did_early_reply(false),
@@ -265,9 +265,9 @@ struct MDRequest : public Mutation {
     _more(0) {
     in[0] = in[1] = 0; 
   }
-  MDRequest(metareqid_t ri, __u32 attempt, MClientRequest *req) : 
+  MDRequestImpl(metareqid_t ri, __u32 attempt, MClientRequest *req) :
+    self_ref(),
     Mutation(ri, attempt),
-    ref(1),
     session(0), item_session_request(this),
     client_request(req), straydn(NULL), snapid(CEPH_NOSNAP), tracei(0), tracedn(0),
     alloc_ino(0), used_prealloc_ino(0), snap_caps(0), did_early_reply(false),
@@ -280,9 +280,9 @@ struct MDRequest : public Mutation {
     _more(0) {
     in[0] = in[1] = 0; 
   }
-  MDRequest(metareqid_t ri, __u32 attempt, int by) : 
+  MDRequestImpl(metareqid_t ri, __u32 attempt, int by) :
+    self_ref(),
     Mutation(ri, attempt, by),
-    ref(1),
     session(0), item_session_request(this),
     client_request(0), straydn(NULL), snapid(CEPH_NOSNAP), tracei(0), tracedn(0),
     alloc_ino(0), used_prealloc_ino(0), snap_caps(0), did_early_reply(false),
@@ -295,16 +295,7 @@ struct MDRequest : public Mutation {
     _more(0) {
     in[0] = in[1] = 0; 
   }
-  ~MDRequest();
-
-  MDRequest *get() {
-    ++ref;
-    return this;
-  }
-  void put() {
-    if (--ref == 0)
-      delete this;
-  }
+  ~MDRequestImpl();
   
   More* more();
   bool has_more();
@@ -320,8 +311,13 @@ struct MDRequest : public Mutation {
   void clear_ambiguous_auth();
 
   void print(ostream &out);
+  void set_self_ref(ceph::shared_ptr<MDRequestImpl>& ref) {
+    self_ref = ref;
+  }
 };
 
+typedef ceph::shared_ptr<MDRequestImpl> MDRequestRef;
+
 
 struct MDSlaveUpdate {
   int origop;
index 984ad2909d8c2ed749d6f432f71963127dbc20eb..986487f09c4fac6a4945a3336d1a8a3f5e2fbf2d 100644 (file)
@@ -544,10 +544,11 @@ void Server::journal_close_session(Session *session, int state)
   mdlog->flush();
 
   // clean up requests, too
-  elist<MDRequest*>::iterator p = session->requests.begin(member_offset(MDRequest,
-                                                                       item_session_request));
+  elist<MDRequestImpl*>::iterator p =
+    session->requests.begin(member_offset(MDRequestImpl,
+                                         item_session_request));
   while (!p.end()) {
-    MDRequest *mdr = *p;
+    MDRequestImpl *mdr = *p;
     ++p;
     mdcache->request_kill(mdr);
   }
index e06a7b7dde3e977fb277e0ac5f67e7e375c2b3ba..ac7fd46d46a9a5bf4a75e0d48ea59d4c873f678f 100644 (file)
@@ -27,7 +27,7 @@ using std::set;
 #include "mdstypes.h"
 
 class CInode;
-struct MDRequest;
+struct MDRequestImpl;
 
 #include "CInode.h"
 #include "Capability.h"
@@ -88,7 +88,7 @@ public:
 
   list<Message*> preopen_out_queue;  ///< messages for client, queued before they connect
 
-  elist<MDRequest*> requests;
+  elist<MDRequestImpl*> requests;
 
   interval_set<inodeno_t> pending_prealloc_inos; // journaling prealloc, will be added to prealloc_inos