From e464a7765230c504b3e3b88bcb1106f67b7c3eb9 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Thu, 9 Oct 2014 13:16:18 +0800 Subject: [PATCH] client: use atomic variable to track reference of MetaRequeset this allow us to increase reference count of MetaRequest while not holding the client_lock Signed-off-by: Yan, Zheng --- src/client/Client.cc | 4 ++-- src/client/MetaRequest.h | 14 ++++++-------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index aeb0530f7f2..2299913fe7f 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -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, diff --git a/src/client/MetaRequest.h b/src/client/MetaRequest.h index b73b67bf7dc..24b2f54cef4 100644 --- a/src/client/MetaRequest.h +++ b/src/client/MetaRequest.h @@ -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