]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: add session pointer to Capability
authorYan, Zheng <zyan@redhat.com>
Mon, 26 Nov 2018 01:44:56 +0000 (09:44 +0800)
committerYan, Zheng <zyan@redhat.com>
Tue, 5 Feb 2019 08:58:46 +0000 (16:58 +0800)
Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
(cherry picked from commit 7c628472a86c6acebb20f0a2504744b10f250587)

 Conflicts:
src/mds/CInode.cc
src/mds/Capability.cc
src/mds/Capability.h
src/mds/Locker.cc

src/mds/CInode.cc
src/mds/Capability.cc
src/mds/Capability.h
src/mds/Locker.cc

index e8c1bc8bc1e3ece37bf17a1cb156ec83e76a2ddd..0c89617aa7c4a6384c62d995238e375daa87b5e9 100644 (file)
@@ -2812,14 +2812,11 @@ Capability *CInode::add_client_cap(client_t client, Session *session, SnapRealm
   if (client_caps.empty())
     mdcache->num_inodes_with_caps++;
   
-  Capability *cap = new Capability(this, ++mdcache->last_cap_id, client);
+  Capability *cap = new Capability(this, session, ++mdcache->last_cap_id);
   assert(client_caps.count(client) == 0);
   client_caps[client] = cap;
 
   session->add_cap(cap);
-  if (session->is_stale())
-    cap->mark_stale();
-  
   cap->client_follows = first-1;
   
   containing_realm->add_cap(client, cap);
index 144f604e6510890c4ff3afe6ad8daeb8ba657377..5c50b59eb7add645cd80c3b09b9ba049104aee5d 100644 (file)
@@ -13,6 +13,7 @@
  */
 
 #include "Capability.h"
+#include "SessionMap.h"
 
 #include "common/Formatter.h"
 
@@ -140,6 +141,28 @@ void Capability::revoke_info::generate_test_instances(list<Capability::revoke_in
 /*
  * Capability
  */
+Capability::Capability(CInode *i, Session *s, uint64_t id) :
+  client_follows(0),
+  client_xattr_version(0), client_inline_version(0),
+  last_rbytes(0), last_rsize(0),
+  item_session_caps(this), item_snaprealm_caps(this),
+  item_revoking_caps(this), item_client_revoking_caps(this),
+  inode(i), session(s),
+  cap_id(id), _wanted(0), num_revoke_warnings(0),
+  _pending(0), _issued(0), last_sent(0), last_issue(0), mseq(0),
+  suppress(0), state(0)
+{
+}
+
+client_t Capability::get_client() const
+{
+  return session ? session->get_client() : client_t(-1);
+}
+
+bool Capability::is_stale() const
+{
+  return session ? session->is_stale() : false;
+}
 
 void Capability::encode(bufferlist& bl) const
 {
index e8e05dbd609eb359792ebfde24b2385cf0a1484c..1d06cd8d06157aa9df4ce7f2d760a6ba790e16a1 100644 (file)
@@ -61,6 +61,7 @@
  */
 
 class CInode;
+class Session;
 
 namespace ceph {
   class Formatter;
@@ -110,26 +111,11 @@ public:
   };
 
 
-  const static unsigned STATE_STALE            = (1<<0);
   const static unsigned STATE_NEW              = (1<<1);
   const static unsigned STATE_IMPORTING                = (1<<2);
 
 
-  Capability(CInode *i = NULL, uint64_t id = 0, client_t c = 0) :
-    client_follows(0), client_xattr_version(0),
-    client_inline_version(0),
-    last_rbytes(0), last_rsize(0),
-    item_session_caps(this), item_snaprealm_caps(this),
-    item_revoking_caps(this), item_client_revoking_caps(this),
-    inode(i), client(c),
-    cap_id(id),
-    _wanted(0), num_revoke_warnings(0),
-    _pending(0), _issued(0),
-    last_sent(0),
-    last_issue(0),
-    mseq(0),
-    suppress(0), state(0) {
-  }
+  Capability(CInode *i=nullptr, Session *s=nullptr, uint64_t id=0);
   Capability(const Capability& other);  // no copying
 
   const Capability& operator=(const Capability& other);  // no copying
@@ -157,14 +143,14 @@ public:
       assert(_pending == c);
     }
     //last_issue = 
-    ++last_sent;
+    inc_last_seq();
     return last_sent;
   }
   ceph_seq_t issue_norevoke(unsigned c) {
     _pending |= c;
     _issued |= c;
     //check_rdcaps_list();
-    ++last_sent;
+    inc_last_seq();
     return last_sent;
   }
   void _calc_issued() {
@@ -238,18 +224,17 @@ public:
   void inc_suppress() { suppress++; }
   void dec_suppress() { suppress--; }
 
-  bool is_stale() { return state & STATE_STALE; }
-  void mark_stale() { state |= STATE_STALE; }
-  void clear_stale() { state &= ~STATE_STALE; }
-  bool is_new() { return state & STATE_NEW; }
+  bool is_stale() const;
+  bool is_new() const { return state & STATE_NEW; }
   void mark_new() { state |= STATE_NEW; }
   void clear_new() { state &= ~STATE_NEW; }
   bool is_importing() { return state & STATE_IMPORTING; }
   void mark_importing() { state |= STATE_IMPORTING; }
   void clear_importing() { state &= ~STATE_IMPORTING; }
 
-  CInode *get_inode() { return inode; }
-  client_t get_client() const { return client; }
+  CInode *get_inode() const { return inode; }
+  Session *get_session() const { return session; }
+  client_t get_client() const;
 
   // caps this client wants to hold
   int wanted() { return _wanted; }
@@ -332,7 +317,7 @@ public:
 
 private:
   CInode *inode;
-  client_t client;
+  Session *session;
 
   uint64_t cap_id;
 
index 42b47087f24b3e923f5b195b369b0b18bf6b5363..69d7ffe76f7362a21f7d9d79d9de0a918067bc1c 100644 (file)
@@ -2163,7 +2163,6 @@ void Locker::revoke_stale_caps(Session *session)
 
   for (xlist<Capability*>::iterator p = session->caps.begin(); !p.end(); ++p) {
     Capability *cap = *p;
-    cap->mark_stale();
     revoke_stale_caps(cap);
   }
 }
@@ -2175,21 +2174,18 @@ void Locker::resume_stale_caps(Session *session)
   for (xlist<Capability*>::iterator p = session->caps.begin(); !p.end(); ++p) {
     Capability *cap = *p;
     CInode *in = cap->get_inode();
-    assert(in->is_head());
-    if (cap->is_stale()) {
-      dout(10) << " clearing stale flag on " << *in << dendl;
-      cap->clear_stale();
-
-      if (in->state_test(CInode::STATE_EXPORTINGCAPS)) {
-       // if export succeeds, the cap will be removed. if export fails,
-       // we need to re-issue the cap if it's not stale.
-       in->state_set(CInode::STATE_EVALSTALECAPS);
-       continue;
-      }
+    ceph_assert(in->is_head());
+    dout(10) << " clearing stale flag on " << *in << dendl;
 
-      if (!in->is_auth() || !eval(in, CEPH_CAP_LOCKS))
-       issue_caps(in, cap);
+    if (in->state_test(CInode::STATE_EXPORTINGCAPS)) {
+      // if export succeeds, the cap will be removed. if export fails,
+      // we need to re-issue the cap if it's not stale.
+      in->state_set(CInode::STATE_EVALSTALECAPS);
+      continue;
     }
+
+    if (!in->is_auth() || !eval(in, CEPH_CAP_LOCKS))
+      issue_caps(in, cap);
   }
 }