]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
uclient: lease seq #'s; clean out inode leases
authorSage Weil <sage@newdream.net>
Sun, 11 Jan 2009 20:01:52 +0000 (12:01 -0800)
committerSage Weil <sage@newdream.net>
Sun, 11 Jan 2009 20:01:52 +0000 (12:01 -0800)
src/client/Client.cc
src/client/Client.h

index 7fd57396a7c71643ada112fe6a9e683dc6945a81..7d07aeec3b7c76376ffe2b8d17e6c29a09b85d2f 100644 (file)
@@ -515,6 +515,7 @@ Inode* Client::insert_dentry_inode(Dir *dir, const string& dname, LeaseStat *dle
       dout(10) << "got dentry lease on " << dname << " dur " << dlease->duration_ms << "ms ttl " << ttl << dendl;
       dn->lease_ttl = ttl;
       dn->lease_mds = from;
+      dn->lease_seq = dlease->seq;
     }
   }
 
@@ -683,8 +684,7 @@ Dentry *Client::lookup(const filepath& path, snapid_t snapid)
       Dir *dir = cur->dir;
       if (dir->dentries.count(path[i])) {
         dn = dir->dentries[path[i]];
-        dout(14) << " hit dentry " << path[i] << " inode is " << dn->inode
-                << " ttl " << dn->inode->lease_ttl << dendl;
+        dout(14) << " hit dentry " << path[i] << " inode is " << dn->inode << dendl;
       } else {
         dout(14) << " dentry " << path[i] << " dne" << dendl;
         return NULL;
@@ -699,8 +699,7 @@ Dentry *Client::lookup(const filepath& path, snapid_t snapid)
   if (!dn) 
     dn = cur->dn;
   if (dn) {
-    dout(11) << "lookup '" << path << "' found " << dn->name << " inode " << dn->inode->inode.ino
-            << " ttl " << dn->inode->lease_ttl << dendl;
+    dout(11) << "lookup '" << path << "' found " << dn->name << " inode " << dn->inode->inode.ino << dendl;
   }
 
   return dn;
@@ -1305,6 +1304,8 @@ void Client::handle_lease(MClientLease *m)
   int mds = m->get_source().num();
   mds_sessions[mds].seq++;
 
+  ceph_seq_t seq = m->get_seq();
+
   Inode *in;
   vinodeno_t vino(m->get_ino(), CEPH_NOSNAP);
   if (inode_map.count(vino) == 0) {
@@ -1320,17 +1321,13 @@ void Client::handle_lease(MClientLease *m)
     }
     Dentry *dn = in->dir->dentries[m->dname];
     dout(10) << " revoked DN lease on " << dn << dendl;
+    if (dn->lease_mds == mds)
+      seq = dn->lease_seq;
     dn->lease_mds = -1;
   } 
-  if (m->get_mask() & in->lease_mask) {
-    int newmask = in->lease_mask & ~m->get_mask();
-    dout(10) << " revoked inode lease on " << in->ino() 
-            << " mask " << in->lease_mask << " -> " << newmask << dendl;
-    in->lease_mask = newmask;
-  }
   
  revoke:
-  messenger->send_message(new MClientLease(CEPH_MDS_LEASE_RELEASE,
+  messenger->send_message(new MClientLease(CEPH_MDS_LEASE_RELEASE, seq,
                                           m->get_mask(), m->get_ino(), m->get_first(), m->get_last(), m->dname),
                          m->get_source_inst());
   delete m;
@@ -1339,29 +1336,18 @@ void Client::handle_lease(MClientLease *m)
 
 void Client::release_lease(Inode *in, Dentry *dn, int mask)
 {
-  int havemask = 0;
-  int mds = -1;
   utime_t now = g_clock.now();
-  string dname;
 
-  // inode?
-  if (in->lease_mds >= 0 && (in->lease_mask & mask) && now < in->lease_ttl) {
-    havemask |= (in->lease_mask & mask);
-    mds = in->lease_mds;
-  }
+  assert(dn);
 
   // dentry?
-  if (dn && dn->lease_mds >= 0 && now < in->lease_ttl) {
-    havemask |= CEPH_LOCK_DN;
-    mds = dn->lease_mds;
-    dname = dn->name;
-  }
-
-  if (mds >= 0 && mdsmap->is_up(mds)) {
-    dout(10) << "release_lease mds" << mds << " mask " << mask
-            << " on " << in->ino() << " " << dname << dendl;
-    messenger->send_message(new MClientLease(CEPH_MDS_LEASE_RELEASE, mask, in->ino(), in->snapid, in->snapid, dname),
-                           mdsmap->get_inst(mds));
+  if (dn->lease_mds >= 0 && now < dn->lease_ttl && mdsmap->is_up(dn->lease_mds)) {
+    dout(10) << "release_lease mds" << dn->lease_mds << " mask " << mask
+            << " on " << in->ino() << " " << dn->name << dendl;
+    messenger->send_message(new MClientLease(CEPH_MDS_LEASE_RELEASE, dn->lease_seq, 
+                                            CEPH_LOCK_DN,
+                                            in->ino(), in->snapid, in->snapid, dn->name),
+                           mdsmap->get_inst(dn->lease_mds));
   }
 }
 
@@ -2874,7 +2860,7 @@ int Client::fill_stat(Inode *in, struct stat *st, frag_info_t *dirstat, nest_inf
   if (rstat)
     *rstat = in->inode.rstat;
 
-  return in->lease_mask;
+  return in->caps_issued();
 }
 
 
@@ -4321,7 +4307,7 @@ int Client::ll_lookup(vinodeno_t parent, const char *name, struct stat *attr, in
        diri->dir->dentries.count(dname)) {
       Dentry *dn = diri->dir->dentries[dname];
       if ((dn->lease_mds >= 0 && dn->lease_ttl > now) ||
-         (diri->lease_mds >= 0 && diri->lease_ttl > now && (diri->lease_mask & CEPH_LOCK_IFILE))) {
+         (diri->caps_issued() & CEPH_CAP_FILE_RDCACHE)) {
        touch_dn(dn);
        in = dn->inode;
        dout(1) << "ll_lookup " << parent << " " << name << " -> have valid lease on dentry|IFILE" << dendl;
index 536c5fe7b9ee9da795424529de90b0ee253847f0..ce6b404afb15f1d3d2822b7ab3a36248d056aeaa 100644 (file)
@@ -90,6 +90,7 @@ class Dentry : public LRUObject {
   int     ref;                       // 1 if there's a dir beneath me.
   int lease_mds;
   utime_t lease_ttl;
+  ceph_seq_t lease_seq;
   
   void get() { 
     assert(ref == 0); ref++; lru_pin(); 
@@ -100,7 +101,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) { }
+  Dentry() : dir(0), inode(0), ref(0), lease_mds(-1), lease_seq(0) { }
 };
 
 class Dir {
@@ -185,8 +186,6 @@ class Inode {
  public:
   inode_t   inode;    // the actual inode
   snapid_t  snapid;
-  int       lease_mask, lease_mds;
-  utime_t   lease_ttl;
 
   // about the dir (if this is one!)
   int       dir_auth;
@@ -263,7 +262,6 @@ class Inode {
   Inode(vinodeno_t vino, ceph_file_layout *layout) : 
     //inode(_inode),
     snapid(vino.snapid),
-    lease_mask(0), lease_mds(-1),
     dir_auth(-1), dir_hashed(false), dir_replicated(false), 
     dirty_caps(0),
     snap_caps(0), snap_cap_refs(0),