]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: refactoring of lease msg sending, add lease half-time accounting
authorYehuda Sadeh <yehuda@hq.newdream.net>
Fri, 13 Mar 2009 23:06:19 +0000 (16:06 -0700)
committerYehuda Sadeh <yehuda@hq.newdream.net>
Fri, 13 Mar 2009 23:29:47 +0000 (16:29 -0700)
src/kernel/dir.c
src/kernel/inode.c
src/kernel/mds_client.c
src/kernel/super.h

index 114d770999d0b55256b0e8c23f17138de0a61241..05af430cbb563e2aef8b65c479b6de74b8dcad9b 100644 (file)
@@ -639,6 +639,7 @@ static int dentry_lease_is_valid(struct dentry *dentry)
        struct ceph_dentry_info *di;
        struct ceph_mds_session *s;
        int valid = 0;
+       int should_renew = 0;
        u32 gen;
        unsigned long ttl;
 
@@ -655,6 +656,8 @@ static int dentry_lease_is_valid(struct dentry *dentry)
                    time_before(jiffies, dentry->d_time) &&
                    time_before(jiffies, ttl)) {
                        valid = 1;
+                       if (time_after(jiffies, di->lease_renew_ttl))
+                               should_renew = 1;
                } else {
                        ceph_put_mds_session(di->lease_session);
                        kfree(di);
@@ -662,6 +665,10 @@ static int dentry_lease_is_valid(struct dentry *dentry)
                }
        }
        spin_unlock(&dentry->d_lock);
+
+       if (should_renew) {
+               dout(0, "dentry_lease should_renew! - dentry %p = %d\n", dentry, valid);
+       }
        dout(20, "dentry_lease_is_valid - dentry %p = %d\n", dentry, valid);
        return valid;
 }
index d13be325e6438ee9ddefe988412cfcdd837a7e79..8534ef2f909861cfb98fe57264e0ae01251e4fbc 100644 (file)
@@ -638,6 +638,7 @@ static void update_dentry_lease(struct dentry *dentry,
        int is_new = 0;
        long unsigned duration = le32_to_cpu(lease->duration_ms);
        long unsigned ttl = from_time + (duration * HZ) / 1000;
+       long unsigned half_ttl = from_time + (duration * HZ / 2) / 1000;
 
        /* only track leases on regular dentries */
        if (dentry->d_op != &ceph_dentry_ops)
@@ -683,6 +684,7 @@ static void update_dentry_lease(struct dentry *dentry,
                is_new = 1;
        } else if (di->lease_session != session)
                goto out_unlock;
+       di->lease_renew_ttl = half_ttl;
        dentry->d_time = ttl;
 out_unlock:
        spin_unlock(&dentry->d_lock);
index 81073f0607864f8ffa6a2565a8149046d3a68a26..997c806c1985dd9f97394195e27a460c2f951d15 100644 (file)
@@ -658,20 +658,15 @@ static void remove_session_caps(struct ceph_mds_session *session)
 }
 
 /*
- * caller must hold session s_mutex
+ * caller must hold session s_mutex, dentry->d_lock
  */
-static void revoke_dentry_lease(struct dentry *dentry)
+static void __drop_dentry_lease(struct dentry *dentry)
 {
        struct ceph_dentry_info *di;
-
-       spin_lock(&dentry->d_lock);
        di = ceph_dentry(dentry);
-       if (di) {
-               ceph_put_mds_session(di->lease_session);
-               kfree(di);
-               dentry->d_fsdata = NULL;
-       }
-       spin_unlock(&dentry->d_lock);
+       ceph_put_mds_session(di->lease_session);
+       kfree(di);
+       dentry->d_fsdata = NULL;
 }
 
 /*
@@ -2007,55 +2002,26 @@ bad:
        dout(0, "corrupt lease message\n");
 }
 
-
-/*
- * Preemptively release a lease we expect to invalidate anyway.
- * Pass @inode always, @dentry is optional.
- */
-void ceph_mdsc_lease_release(struct ceph_mds_client *mdsc, struct inode *inode,
-                            struct dentry *dentry, int mask)
+void ceph_mdsc_lease_send_msg(struct ceph_mds_client *mdsc, int mds, struct inode *inode,
+                       struct dentry *dentry, char action, int mask)
 {
        struct ceph_msg *msg;
        struct ceph_mds_lease *lease;
-       struct ceph_dentry_info *di;
-       int origmask = mask;
-       int mds = -1;
        int len = sizeof(*lease) + sizeof(u32);
        int dnamelen = 0;
+       struct ceph_dentry_info *di;
 
-       BUG_ON(inode == NULL);
-       BUG_ON(dentry == NULL);
+       dout(0, "lease_release inode %p dentry %p %d mask %d to mds%d\n",
+            inode, dentry, dnamelen, mask, mds);
 
-       /* is dentry lease valid? */
-       if (mask & CEPH_LOCK_DN) {
-               spin_lock(&dentry->d_lock);
-               di = ceph_dentry(dentry);
-               if (di &&
-                   di->lease_session->s_mds >= 0 &&
-                   di->lease_gen == di->lease_session->s_cap_gen &&
-                   time_before(jiffies, dentry->d_time)) {
-                       /* we do have a lease on this dentry; note mds */
-                       mds = di->lease_session->s_mds;
-                       dnamelen = dentry->d_name.len;
-                       len += dentry->d_name.len;
-               } else {
-                       mask &= ~CEPH_LOCK_DN;  /* no lease; clear DN bit */
-               }
-               spin_unlock(&dentry->d_lock);
-       } else {
-               mask &= ~CEPH_LOCK_DN;  /* no lease; clear DN bit */
-       }
+       BUG_ON(!dentry);
 
-       if (mask == 0) {
-               dout(10, "lease_release inode %p dentry %p -- "
-                    "no lease on %d\n",
-                    inode, dentry, origmask);
-               return;  /* nothing to drop */
-       }
-       BUG_ON(mds < 0);
+       dnamelen = dentry->d_name.len;
+       len += dnamelen;
+
+       di = ceph_dentry(dentry);
+       BUG_ON(!di);
 
-       dout(10, "lease_release inode %p dentry %p %d mask %d to mds%d\n",
-            inode, dentry, dnamelen, mask, mds);
        msg = ceph_msg_new(CEPH_MSG_CLIENT_LEASE, len, 0, 0, NULL);
        if (IS_ERR(msg))
                return;
@@ -2064,13 +2030,55 @@ void ceph_mdsc_lease_release(struct ceph_mds_client *mdsc, struct inode *inode,
        lease->mask = cpu_to_le16(mask);
        lease->ino = cpu_to_le64(ceph_vino(inode).ino);
        lease->first = lease->last = cpu_to_le64(ceph_vino(inode).snap);
+       lease->seq = di->lease_seq;
        *(__le32 *)((void *)lease + sizeof(*lease)) = cpu_to_le32(dnamelen);
-       if (dentry)
+       if (dentry) {
                memcpy((void *)lease + sizeof(*lease) + 4, dentry->d_name.name,
                       dnamelen);
+       }
        ceph_send_msg_mds(mdsc, msg, mds);
 }
 
+/*
+ * Preemptively release a lease we expect to invalidate anyway.
+ * Pass @inode always, @dentry is optional.
+ */
+void ceph_mdsc_lease_release(struct ceph_mds_client *mdsc, struct inode *inode,
+                            struct dentry *dentry, int mask)
+{
+       struct ceph_dentry_info *di;
+       int mds = -1;
+
+       BUG_ON(inode == NULL);
+       BUG_ON(dentry == NULL);
+       BUG_ON(mask != CEPH_LOCK_DN);
+
+       /* is dentry lease valid? */
+       spin_lock(&dentry->d_lock);
+       di = ceph_dentry(dentry);
+       if (di &&
+           di->lease_session->s_mds >= 0 &&
+           di->lease_gen == di->lease_session->s_cap_gen &&
+           time_before(jiffies, dentry->d_time)) {
+               /* we do have a lease on this dentry; note mds */
+               mds = di->lease_session->s_mds;
+       } else {
+               dout(10, "lease_release inode %p dentry %p -- "
+                    "no lease on %d\n",
+                    inode, dentry, mask);
+               return;
+       }
+       __drop_dentry_lease(dentry);
+       spin_unlock(&dentry->d_lock);
+
+       BUG_ON(mds < 0);
+
+       dout(10, "lease_release inode %p dentry %p mask %d to mds%d\n",
+            inode, dentry, mask, mds);
+
+       ceph_mdsc_lease_send_msg(mdsc, mds, inode, dentry, CEPH_MDS_LEASE_RELEASE, mask);
+}
+
 
 /*
  * delayed work -- periodically trim expired leases, renew caps with mds
index 70b2fb42a3dca87d67dfe8c88af1ac7e21c49a1b..4b4de630fac7e7767d4c272ae4d36a1d5ecbb2f9 100644 (file)
@@ -367,6 +367,7 @@ struct ceph_dentry_info {
        struct ceph_mds_session *lease_session;
        u32 lease_gen;
        u32 lease_seq;
+       unsigned long lease_renew_ttl;
 };
 
 static inline struct ceph_dentry_info *ceph_dentry(struct dentry *dentry)