From 7c628472a86c6acebb20f0a2504744b10f250587 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Mon, 26 Nov 2018 09:44:56 +0800 Subject: [PATCH] mds: add session pointer to Capability Signed-off-by: "Yan, Zheng" --- src/mds/CInode.cc | 4 +--- src/mds/Capability.cc | 23 +++++++++++++++++++++++ src/mds/Capability.h | 31 ++++++++----------------------- src/mds/Locker.cc | 22 +++++++++------------- 4 files changed, 41 insertions(+), 39 deletions(-) diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 801b20a1e7f1b..5821b7adad240 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -3009,13 +3009,11 @@ Capability *CInode::add_client_cap(client_t client, Session *session, SnapRealm uint64_t cap_id = ++mdcache->last_cap_id; auto ret = client_caps.emplace(std::piecewise_construct, std::forward_as_tuple(client), - std::forward_as_tuple(this, cap_id, client)); + std::forward_as_tuple(this, session, cap_id)); ceph_assert(ret.second == true); Capability *cap = &ret.first->second; 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 3d7c498bc52f9..4e88f0c8d5447 100644 --- a/src/mds/Capability.cc +++ b/src/mds/Capability.cc @@ -14,6 +14,7 @@ #include "Capability.h" #include "CInode.h" +#include "SessionMap.h" #include "common/Formatter.h" @@ -141,6 +142,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::set_wanted(int w) { CInode *in = get_inode(); diff --git a/src/mds/Capability.h b/src/mds/Capability.h index bd3fcd448cd21..cf6abb343edf2 100644 --- a/src/mds/Capability.h +++ b/src/mds/Capability.h @@ -61,6 +61,7 @@ */ class CInode; +class Session; namespace ceph { class Formatter; @@ -110,27 +111,12 @@ public: }; - const static unsigned STATE_STALE = (1<<0); const static unsigned STATE_NEW = (1<<1); const static unsigned STATE_IMPORTING = (1<<2); const static unsigned STATE_NEEDSNAPFLUSH = (1<<3); - 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) = delete; const Capability& operator=(const Capability& other) = delete; @@ -158,14 +144,14 @@ public: ceph_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() { @@ -239,9 +225,7 @@ public: void inc_suppress() { suppress++; } void dec_suppress() { suppress--; } - bool is_stale() const { return state & STATE_STALE; } - void mark_stale() { state |= STATE_STALE; } - void clear_stale() { state &= ~STATE_STALE; } + bool is_stale() const; bool is_new() const { return state & STATE_NEW; } void mark_new() { state |= STATE_NEW; } void clear_new() { state &= ~STATE_NEW; } @@ -253,7 +237,8 @@ public: void clear_needsnapflush() { state &= ~STATE_NEEDSNAPFLUSH; } CInode *get_inode() const { return inode; } - client_t get_client() const { return client; } + Session *get_session() const { return session; } + client_t get_client() const; // caps this client wants to hold int wanted() const { return _wanted; } @@ -333,7 +318,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 e103a5ee029e3..95615344aa7c4 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -2150,7 +2150,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); } } @@ -2163,20 +2162,17 @@ void Locker::resume_stale_caps(Session *session) Capability *cap = *p; CInode *in = cap->get_inode(); ceph_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; - } + 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); } } -- 2.39.5