]> 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)
committerYan, Zheng <zyan@redhat.com>
Thu, 3 May 2018 02:49:24 +0000 (10:49 +0800)
Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
Fixes: https://tracker.ceph.com/issues/23894
src/client/Client.cc

index 9991d578fac10929eca639fb6a5c6910de48082b..c2fd857e73a07c860ca81b98727e33d398440e6e 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();