From 15abbfbe5c06a35ac8b8d6408a77bb6267b259f6 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 23 Jul 2010 14:54:44 -0700 Subject: [PATCH] mds: create leases with non-zero seq We want to avoid the situation: - mds issues lease, seq 0 - mds times out lease, seq 0 - client sends seq 0 release - mds issues new lease, seq 0 (again.. poor choice of seq#) - mds processes client lease seq 0 release (bad) --- src/mds/CDentry.cc | 3 ++- src/mds/CDentry.h | 3 ++- src/mds/Locker.cc | 2 +- src/mds/SessionMap.h | 6 +++++- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/mds/CDentry.cc b/src/mds/CDentry.cc index c72c0557ba8de..56e9052e2b668 100644 --- a/src/mds/CDentry.cc +++ b/src/mds/CDentry.cc @@ -503,7 +503,7 @@ void CDentry::decode_lock_state(int type, bufferlist& bl) } -ClientLease *CDentry::add_client_lease(client_t c, int mask) +ClientLease *CDentry::add_client_lease(client_t c, int mask, Session *session) { ClientLease *l; if (client_lease_map.count(c)) @@ -512,6 +512,7 @@ ClientLease *CDentry::add_client_lease(client_t c, int mask) if (client_lease_map.empty()) get(PIN_CLIENTLEASE); l = client_lease_map[c] = new ClientLease(c, this); + l->seq = ++session->lease_seq; } int adding = ~l->mask & mask; diff --git a/src/mds/CDentry.h b/src/mds/CDentry.h index b67a71549a957..c647ad04d276d 100644 --- a/src/mds/CDentry.h +++ b/src/mds/CDentry.h @@ -41,6 +41,7 @@ class Anchor; class CDentry; class LogSegment; +class Session; @@ -381,7 +382,7 @@ public: return 0; } - ClientLease *add_client_lease(client_t c, int mask); + ClientLease *add_client_lease(client_t c, int mask, Session *session); int remove_client_lease(ClientLease *r, int mask, class Locker *locker); // returns remaining mask (if any), and kicks locker eval_gathers diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 96c9a55e4762b..da589af1ff606 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -2231,7 +2231,7 @@ void Locker::_issue_client_lease(CDentry *dn, int mask, int pool, client_t clien e.mask = 1; if (mask) { - ClientLease *l = dn->add_client_lease(client, mask); + ClientLease *l = dn->add_client_lease(client, mask, session); session->touch_lease(l); e.seq = ++l->seq; diff --git a/src/mds/SessionMap.h b/src/mds/SessionMap.h index 6cb0c3b7ba4a9..661a6bd61b473 100644 --- a/src/mds/SessionMap.h +++ b/src/mds/SessionMap.h @@ -157,6 +157,9 @@ public: leases.push_back(&r->item_session_lease); } + // -- leases -- + uint32_t lease_seq; + // -- completed requests -- private: set completed_requests; @@ -180,7 +183,8 @@ public: state(STATE_CLOSED), state_seq(0), importing_count(0), connection(NULL), item_session_list(this), requests(0), // member_offset passed to front() manually - cap_push_seq(0) { } + cap_push_seq(0), + lease_seq(0) { } ~Session() { assert(!item_session_list.is_on_list()); } -- 2.39.5