]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: create leases with non-zero seq
authorSage Weil <sage@newdream.net>
Fri, 23 Jul 2010 21:54:44 +0000 (14:54 -0700)
committerSage Weil <sage@newdream.net>
Fri, 23 Jul 2010 22:50:32 +0000 (15:50 -0700)
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
src/mds/CDentry.h
src/mds/Locker.cc
src/mds/SessionMap.h

index c72c0557ba8de817cf8b639f0188874bb8fe9574..56e9052e2b6683c1c60c713a191dcdaa5decf5a7 100644 (file)
@@ -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;
index b67a71549a9579af0b91dfcfc8f0d13c89ea93c0..c647ad04d276d3763e6c8b58458fdcf3cec2971f 100644 (file)
@@ -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
   
 
index 96c9a55e4762b9475b1d2d3977f5e096b0de8456..da589af1ff606fc24fc2320a060ba05a0c1ac838 100644 (file)
@@ -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;
index 6cb0c3b7ba4a9bdd3884d546aadd29acc3778224..661a6bd61b473d4499bb5ea216dd709711ee45af 100644 (file)
@@ -157,6 +157,9 @@ public:
     leases.push_back(&r->item_session_lease);
   }
 
+  // -- leases --
+  uint32_t lease_seq;
+
   // -- completed requests --
 private:
   set<tid_t> 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());
   }