From: Yan, Zheng Date: Mon, 26 Nov 2018 01:44:56 +0000 (+0800) Subject: mds: add session pointer to Capability X-Git-Tag: v12.2.12~111^2~7 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=bd647b24844c69cde95858cc3ca2feea2f51512f;p=ceph.git mds: add session pointer to Capability Signed-off-by: "Yan, Zheng" (cherry picked from commit 7c628472a86c6acebb20f0a2504744b10f250587) Conflicts: src/mds/CInode.cc src/mds/Capability.cc src/mds/Capability.h src/mds/Locker.cc --- diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index e8c1bc8bc1e..0c89617aa7c 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -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); diff --git a/src/mds/Capability.cc b/src/mds/Capability.cc index 144f604e651..5c50b59eb7a 100644 --- a/src/mds/Capability.cc +++ b/src/mds/Capability.cc @@ -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(listget_client() : client_t(-1); +} + +bool Capability::is_stale() const +{ + return session ? session->is_stale() : false; +} void Capability::encode(bufferlist& bl) const { diff --git a/src/mds/Capability.h b/src/mds/Capability.h index e8e05dbd609..1d06cd8d061 100644 --- a/src/mds/Capability.h +++ b/src/mds/Capability.h @@ -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; diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 42b47087f24..69d7ffe76f7 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -2163,7 +2163,6 @@ void Locker::revoke_stale_caps(Session *session) for (xlist::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::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); } }