]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: fix lease release; add lease renew support in MDS
authorSage Weil <sage@newdream.net>
Fri, 13 Mar 2009 21:25:21 +0000 (14:25 -0700)
committerSage Weil <sage@newdream.net>
Fri, 13 Mar 2009 21:43:17 +0000 (14:43 -0700)
src/TODO
src/include/ceph_fs.h
src/mds/Locker.cc

index 1c30cccb6bb950a9d2ac05961366f5bb14a55360..cda0f424a5bbbe4a68db4c8021ad93ea92e80da1 100644 (file)
--- a/src/TODO
+++ b/src/TODO
@@ -12,10 +12,10 @@ v0.7
 /- proc/sysfs cleanup
 
 v0.8
+/- O_DIRECT
 - kill fill_trace
 
 - ENOSPC
-- O_DIRECT
 - flock
 
 - fully async file creation
@@ -53,7 +53,7 @@ repair
 
 
 kernel client
-- O_DIRECT
+- should O_DIRECT invalidate the page cache?
 - inotify for updates from other clients?
 - optional or no fill_trace?
 - flock, fnctl locks
index 3a18f37fc78555f4cdd441d5e15d2f1caa08756b..747df59cab885d07f0bdeb474df6f3efca45e893 100644 (file)
@@ -44,7 +44,7 @@
 #define CEPH_MDS_PROTOCOL     5 /* cluster internal */
 #define CEPH_MON_PROTOCOL     4 /* cluster internal */
 #define CEPH_OSDC_PROTOCOL    5 /* public/client */
-#define CEPH_MDSC_PROTOCOL    8 /* public/client */
+#define CEPH_MDSC_PROTOCOL    9 /* public/client */
 #define CEPH_MONC_PROTOCOL    7 /* public/client */
 
 
@@ -1095,6 +1095,8 @@ struct ceph_mds_lease {
        __le64 ino;
        __le64 first, last;
        __le32 seq;
+       __le64 renew_start;  /* time renew was requested */
+       __le32 duration_ms;  /* duration of renewal */
 } __attribute__ ((packed));
 /* followed by a __le32+string for dname */
 
index 1119704153ce139447345322d17a2d93afd81ce8..3d055b4d28fa572528cd527c56f1377a93a7897f 100644 (file)
@@ -1764,32 +1764,44 @@ void Locker::handle_client_lease(MClientLease *m)
     delete m;
     return;
   } 
-  if ((m->get_action() == CEPH_MDS_LEASE_REVOKE_ACK) &&
-      (l->seq != m->get_seq())) {
-    dout(7) << "handle_client_lease lease seq " << l->seq << " != provided " << m->get_seq() << dendl;
-    delete m;
-    return;
-  }
 
   switch (m->get_action()) {
   case CEPH_MDS_LEASE_REVOKE_ACK:
   case CEPH_MDS_LEASE_RELEASE:
-    {
+    if (l->seq != m->get_seq()) {
+      dout(7) << "handle_client_lease release - seq " << l->seq << " != provided " << m->get_seq() << dendl;
+    } else {
       dout(7) << "handle_client_lease client" << client
              << " release mask " << m->get_mask()
              << " on " << *p << dendl;
       int left = p->remove_client_lease(l, l->mask, this);
       dout(10) << " remaining mask is " << left << " on " << *p << dendl;
     }
+    delete m;
     break;
 
   case CEPH_MDS_LEASE_RENEW:
+    {
+      dout(7) << "handle_client_lease client" << client
+             << " renew mask " << m->get_mask()
+             << " on " << *p << dendl;
+      int pool = 1;   // fixme.. do something smart!
+      m->h.duration_ms = (int)(1000 * mdcache->client_lease_durations[pool]);
+      m->h.seq = ++l->seq;
+      m->clear_payload();
+      
+      utime_t now = g_clock.now();
+      now += mdcache->client_lease_durations[pool];
+      mdcache->touch_client_lease(l, pool, now);
+      
+      mds->send_message_client(m, client);
+    }
+    break;
+
   default:
     assert(0); // implement me
     break;
   }
-
-  delete m;
 }