]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
uclient: do local lookups if FILE_RDCACHE on dir and rdcache_gen matches
authorSage Weil <sage@newdream.net>
Tue, 21 Apr 2009 23:23:42 +0000 (16:23 -0700)
committerSage Weil <sage@newdream.net>
Tue, 21 Apr 2009 23:27:12 +0000 (16:27 -0700)
src/client/Client.cc
src/client/Client.h

index 6a59bb81cee1e8ad84c11c40c969b7fa384f5b6c..3a36e54f9816af2fd474561d2c226e9057634f16 100644 (file)
@@ -499,6 +499,7 @@ void Client::insert_dentry_inode(Dir *dir, const string& dname, LeaseStat *dleas
       dn->lease_seq = dlease->seq;
     }
   }
+  dn->cap_rdcache_gen = dir->parent_inode->rdcache_gen;
 }
 
 
@@ -1724,6 +1725,10 @@ void Client::add_update_cap(Inode *in, int mds, __u64 cap_id,
   if (flags & CEPH_CAP_FLAG_AUTH)
     in->auth_cap = cap;
 
+  if ((issued & CEPH_CAP_FILE_RDCACHE) &&
+      !(cap->issued & CEPH_CAP_FILE_RDCACHE))
+    in->rdcache_gen++;
+
   unsigned old_caps = cap->issued;
   cap->cap_id = cap_id;
   cap->issued |= issued;
@@ -2218,6 +2223,10 @@ void Client::handle_cap_grant(Inode *in, int mds, InodeCap *cap, MClientCaps *m)
     kick_writers = true;
   }
 
+  if ((issued & CEPH_CAP_FILE_RDCACHE) &&
+      !(cap->issued & CEPH_CAP_FILE_RDCACHE))
+    in->rdcache_gen++;
+
   // update caps
   if (old_caps & ~new_caps) { 
     dout(10) << "  revocation of " << ccap_string(~new_caps & old_caps) << dendl;
@@ -2634,8 +2643,10 @@ int Client::_lookup(Inode *dir, const string& dname, Inode **target)
             << dendl;
 
     // is lease valid?
-    if (dn->lease_mds >= 0 && 
-       dn->lease_ttl > g_clock.now()) {
+    if ((dn->lease_mds >= 0 && 
+        dn->lease_ttl > g_clock.now()) ||
+       ((dir->caps_issued() & CEPH_CAP_FILE_RDCACHE) &&
+        dn->cap_rdcache_gen == dir->rdcache_gen)) {
       *target = dn->inode;
       goto done;
     }
index 2930cbbd937d6b73e0dce1b8c061aa8250b65d2d..c0da73d514fde714bc4eb0c24dcb7f0edb89aafc 100644 (file)
@@ -103,6 +103,7 @@ class Dentry : public LRUObject {
   int lease_mds;
   utime_t lease_ttl;
   ceph_seq_t lease_seq;
+  int cap_rdcache_gen;
   
   void get() { 
     assert(ref == 0); ref++; lru_pin(); 
@@ -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) { }
+  Dentry() : dir(0), inode(0), ref(0), lease_mds(-1), lease_seq(0), cap_rdcache_gen(0) { }
 };
 
 class Dir {
@@ -208,6 +209,7 @@ class Inode {
   map<int,InodeCap*> caps;            // mds -> InodeCap
   InodeCap *auth_cap;
   unsigned dirty_caps, flushing_caps;
+  int rdcache_gen;
   int snap_caps, snap_cap_refs;
   unsigned exporting_issued;
   int exporting_mds;
@@ -292,7 +294,7 @@ class Inode {
     //inode(_inode),
     snapid(vino.snapid),
     dir_auth(-1), dir_hashed(false), dir_replicated(false), 
-    dirty_caps(0), flushing_caps(0),
+    dirty_caps(0), flushing_caps(0), rdcache_gen(0),
     snap_caps(0), snap_cap_refs(0),
     exporting_issued(0), exporting_mds(-1), exporting_mseq(0),
     cap_item(this),