From: Sage Weil Date: Tue, 21 Apr 2009 23:23:42 +0000 (-0700) Subject: uclient: do local lookups if FILE_RDCACHE on dir and rdcache_gen matches X-Git-Tag: v0.7.3~82 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=69b8602d0c38206e52bd8eedea8daeed9520b5a4;p=ceph.git uclient: do local lookups if FILE_RDCACHE on dir and rdcache_gen matches --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 6a59bb81cee..3a36e54f981 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -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; } diff --git a/src/client/Client.h b/src/client/Client.h index 2930cbbd937..c0da73d514f 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -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 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),