]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: use atomic variable to track reference of MetaRequeset
authorYan, Zheng <zyan@redhat.com>
Thu, 9 Oct 2014 05:16:18 +0000 (13:16 +0800)
committerYan, Zheng <zyan@redhat.com>
Mon, 13 Oct 2014 06:44:31 +0000 (14:44 +0800)
this allow us to increase reference count of MetaRequest while not holding
the client_lock

Signed-off-by: Yan, Zheng <zyan@redhat.com>
src/client/Client.cc
src/client/MetaRequest.h

index aeb0530f7f2170a7b008f10b6c9ffb3cecf26c62..2299913fe7fa5a01d5989905ff856eba620e1440 100644 (file)
@@ -1487,15 +1487,15 @@ int Client::make_request(MetaRequest *request,
 
 void Client::put_request(MetaRequest *request)
 {
-  if (request->get_num_ref() == 1) {
+  if (request->_put()) {
     if (request->inode())
       put_inode(request->take_inode());
     if (request->old_inode())
       put_inode(request->take_old_inode());
     if (request->other_inode())
       put_inode(request->take_other_inode());
+    delete request;
   }
-  request->_put();
 }
 
 int Client::encode_inode_release(Inode *in, MetaRequest *req,
index b73b67bf7dcdd81400eb946052b1dd258432b888..24b2f54cef4e68c6aae0ff6189f6bbe891a22023 100644 (file)
@@ -9,6 +9,7 @@
 #include "msg/msg_types.h"
 #include "include/xlist.h"
 #include "include/filepath.h"
+#include "include/atomic.h"
 #include "mds/mdstypes.h"
 
 #include "common/Mutex.h"
@@ -48,7 +49,7 @@ public:
   __u32    sent_on_mseq;       // mseq at last submission of this request
   int      num_fwd;            // # of times i've been forwarded
   int      retry_attempt;
-  int      ref;
+  atomic_t ref;
   
   MClientReply *reply;         // the reply
   bool kick;
@@ -127,17 +128,14 @@ public:
   Dentry *old_dentry();
 
   MetaRequest* get() {
-    ++ref;
+    ref.inc();
     return this;
   }
 
   /// psuedo-private put method; use Client::put_request()
-  void _put() {
-    if (--ref == 0)
-      delete this;
-  }
-  int get_num_ref() {
-    return ref;
+  bool _put() {
+    int v = ref.dec();
+    return v == 0;
   }
 
   // normal fields