]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: invalidate caps and leases when session becomes stale
authorYan, Zheng <zyan@redhat.com>
Sat, 28 Apr 2018 04:36:43 +0000 (12:36 +0800)
committerPatrick Donnelly <pdonnell@redhat.com>
Mon, 7 May 2018 22:55:05 +0000 (15:55 -0700)
Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
Fixes: https://tracker.ceph.com/issues/23894
(cherry picked from commit 8b2e7d834ccf2a4ff6c7aa3d4aeee07ebe36fb59)

src/client/Client.cc

index d615a854e31d08e197c09e9b723e512650acac9e..d87bd1e1bf10c7cf6b01057b2a6dcfbcb84791b0 100644 (file)
@@ -2075,6 +2075,10 @@ void Client::handle_client_session(MClientSession *m)
     break;
 
   case CEPH_SESSION_STALE:
+    // invalidate session caps/leases
+    session->cap_gen++;
+    session->cap_ttl = ceph_clock_now();
+    session->cap_ttl -= 1;
     renew_caps(session);
     break;
 
@@ -3893,6 +3897,7 @@ void Client::add_update_cap(Inode *in, MetaSession *mds_session, uint64_t cap_id
   cap.seq = seq;
   cap.issue_seq = seq;
   cap.mseq = mseq;
+  cap.gen = mds_session->cap_gen;
   cap.latest_perms = cap_perms;
   ldout(cct, 10) << __func__ << " issued " << ccap_string(old_caps) << " -> " << ccap_string(cap.issued)
           << " from mds." << mds
@@ -5028,6 +5033,7 @@ void Client::handle_cap_grant(MetaSession *session, Inode *in, Cap *cap, MClient
                << " caps now " << ccap_string(new_caps)
                << " was " << ccap_string(old_caps) << dendl;
   cap->seq = m->get_seq();
+  cap->gen = session->cap_gen;
 
   in->layout = m->get_layout();