]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
uclient: verify dentries belong to current session
authorSage Weil <sage@newdream.net>
Fri, 26 Jun 2009 00:49:59 +0000 (17:49 -0700)
committerSage Weil <sage@newdream.net>
Fri, 26 Jun 2009 00:50:08 +0000 (17:50 -0700)
Check against session cap_gen

src/TODO
src/client/Client.cc
src/client/Client.h

index 53dc7adf1b0357e07334f01c29dcad881d8e1cad..2b4589cb09160ca688d7d2b95a587fd059ab595a 100644 (file)
--- a/src/TODO
+++ b/src/TODO
@@ -135,6 +135,7 @@ osd
 - segregate backlog from log ondisk?
 - preserve pg logs on disk for longer period
 - make scrub interruptible
+- salvage some way to allow both RMW and DELAYED mode ops?
 - optionally separate osd interfaces (ips) for clients and osds (replication, peering, etc.)
 - pg repair
 - pg split should be a work queue
@@ -144,9 +145,7 @@ userspace client
 - handle session STALE
 - time out caps, wake up waiters on renewal
   - link caps with mds session
-- validate dn leases
 - fix lease validation to check session ttl
-- clean up ll_ interface, now that we have leases!
 - clean up client mds session vs mdsmap behavior?
 - stop using mds's inode_t?
 - fix readdir vs fragment race by keeping a separate frag pos, and ignoring dentries below it
index bf5379070d009b7ac245d9e0d849f9e8edf7f231..af2a83121f5b3deb6f87aa19fd40fea74fcc26b9 100644 (file)
@@ -503,6 +503,7 @@ void Client::insert_dentry_inode(Dir *dir, const string& dname, LeaseStat *dleas
       dn->lease_ttl = dttl;
       dn->lease_mds = mds;
       dn->lease_seq = dlease->seq;
+      dn->lease_gen = mds_sessions[mds].cap_gen;
     }
   }
   dn->cap_shared_gen = dir->parent_inode->shared_gen;
@@ -2565,11 +2566,21 @@ int Client::_lookup(Inode *dir, const string& dname, Inode **target)
             << " seq " << dn->lease_seq
             << dendl;
 
-    // is lease valid?
-    if ((dn->lease_mds >= 0 && 
-        dn->lease_ttl > g_clock.now()) ||
-       ((dir->caps_issued() & CEPH_CAP_FILE_SHARED) &&
-        dn->cap_shared_gen == dir->shared_gen)) {
+    // is dn lease valid?
+    utime_t now = g_clock.now();
+    if (dn->lease_mds >= 0 && 
+       dn->lease_ttl > now &&
+       mds_sessions.count(dn->lease_mds)) {
+      MDSSession &s = mds_sessions[dn->lease_mds];
+      if (s.cap_ttl > now &&
+         s.cap_gen == dn->lease_gen) {
+       *target = dn->inode;
+       goto done;
+      }
+    }
+    // dir lease?
+    if ((dir->caps_issued() & CEPH_CAP_FILE_SHARED) &&
+       dn->cap_shared_gen == dir->shared_gen) {
       *target = dn->inode;
       goto done;
     }
index f7ee455d8ad144ab909531d5e9e957a90bdd951f..42d6d21b1da7372543851c3d6a86e5d52941ee32 100644 (file)
@@ -101,6 +101,7 @@ class Dentry : public LRUObject {
   int     ref;                       // 1 if there's a dir beneath me.
   int lease_mds;
   utime_t lease_ttl;
+  __u64 lease_gen;
   ceph_seq_t lease_seq;
   int cap_shared_gen;
   
@@ -113,7 +114,7 @@ class Dentry : public LRUObject {
     //cout << "dentry.put on " << this << " " << name << " now " << ref << std::endl;
   }
   
-  Dentry() : dir(0), inode(0), ref(0), lease_mds(-1), lease_seq(0), cap_shared_gen(0) { }
+  Dentry() : dir(0), inode(0), ref(0), lease_mds(-1), lease_gen(0), lease_seq(0), cap_shared_gen(0) { }
 };
 
 class Dir {