]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: simplify release context ref mgmt
authorPatrick Donnelly <pdonnell@redhat.com>
Mon, 6 Feb 2017 18:51:11 +0000 (13:51 -0500)
committerPatrick Donnelly <pdonnell@redhat.com>
Sun, 1 Oct 2017 00:30:04 +0000 (17:30 -0700)
Signed-off-by: Patrick Donnelly <pdonnell@redhat.com>
src/client/Client.cc
src/client/Client.h
src/client/MetaSession.cc
src/client/MetaSession.h
src/msg/Connection.h

index 8b449042a434ce975301696749ec4a89fb4f933a..66183654e28c571e8d2777d62a926790d9882824 100644 (file)
@@ -56,7 +56,6 @@
 #include "messages/MCommandReply.h"
 #include "messages/MOSDMap.h"
 #include "messages/MClientQuota.h"
-#include "messages/MClientCapRelease.h"
 #include "messages/MMDSMap.h"
 #include "messages/MFSMap.h"
 #include "messages/MFSMapUser.h"
@@ -2689,10 +2688,7 @@ void Client::send_reconnect(MetaSession *session)
 
   session->readonly = false;
 
-  if (session->release) {
-    session->release->put();
-    session->release = NULL;
-  }
+  session->release.reset();
 
   // reset my cap seq number
   session->seq = 0;
@@ -5961,11 +5957,10 @@ void Client::flush_cap_releases()
           p->first)) {
       if (cct->_conf->client_inject_release_failure) {
         ldout(cct, 20) << __func__ << " injecting failure to send cap release message" << dendl;
-        p->second->release->put();
       } else {
         p->second->con->send_message(p->second->release);
       }
-      p->second->release = 0;
+      p->second->release.reset();
     }
   }
 }
index 7828c3b217c128d2a71133518b7e005559a8098f..312d6f9d5d91340de4252482ae3cb6764b839ef0 100644 (file)
@@ -62,7 +62,6 @@ class MClientRequest;
 class MClientRequestForward;
 struct MClientLease;
 class MClientCaps;
-class MClientCapRelease;
 
 struct DirStat;
 struct LeaseStat;
index 03752d246ae93138de707f6f7a6e64884a387db6..9f7aefc5bc0baaa0d41951e0d1040de82100961b 100644 (file)
@@ -34,17 +34,11 @@ void MetaSession::dump(Formatter *f) const
   f->dump_string("state", get_state_name());
 }
 
-MetaSession::~MetaSession()
-{
-  if (release)
-    release->put();
-}
-
 void MetaSession::enqueue_cap_release(inodeno_t ino, uint64_t cap_id, ceph_seq_t iseq,
     ceph_seq_t mseq, epoch_t osd_barrier)
 {
   if (!release) {
-    release = new MClientCapRelease;
+    release.reset(new MClientCapRelease, false);
   }
 
   if (osd_barrier > release->osd_epoch_barrier) {
index af84615fc1d825d71821923b31d0192204d4ff92..0bffb5a0c51b4312cfaa887838d4ee2839157a24 100644 (file)
@@ -6,15 +6,14 @@
 
 #include "include/types.h"
 #include "include/utime.h"
-#include "msg/Message.h"
 #include "include/xlist.h"
 #include "mds/mdstypes.h"
+#include "messages/MClientCapRelease.h"
 
 struct Cap;
 struct Inode;
 struct CapSnap;
 struct MetaRequest;
-class MClientCapRelease;
 
 struct MetaSession {
   mds_rank_t mds_num;
@@ -47,15 +46,13 @@ struct MetaSession {
   std::set<ceph_tid_t> flushing_caps_tids;
   std::set<Inode*> early_flushing_caps;
 
-  MClientCapRelease *release;
+  boost::intrusive_ptr<MClientCapRelease> release;
   
   MetaSession()
     : mds_num(-1), con(NULL),
       seq(0), cap_gen(0), cap_renew_seq(0), num_caps(0),
-      state(STATE_NEW), mds_state(0), readonly(false),
-      release(NULL)
+      state(STATE_NEW), mds_state(0), readonly(false)
   {}
-  ~MetaSession();
 
   const char *get_state_name() const;
 
index 94e934c55f1335fbec249ed8f6954d835f5b1a52..b8ffbbf9b30818175830b524f28d3099cd0d73c8 100644 (file)
@@ -117,6 +117,12 @@ public:
    * @return 0 on success, or -errno on failure.
    */
   virtual int send_message(Message *m) = 0;
+
+  int send_message(boost::intrusive_ptr<Message> m)
+  {
+    return send_message(m.detach()); /* send_message(Message *m) consumes a reference */
+  }
+
   /**
    * Send a "keepalive" ping along the given Connection, if it's working.
    * If the underlying connection has broken, this function does nothing.