NFSv4.1: Retry pNFS after a 2 minute timeout
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Tue, 18 Sep 2012 21:01:12 +0000 (17:01 -0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Fri, 28 Sep 2012 20:03:09 +0000 (16:03 -0400)
If we had to fall back to read/write through MDS, then assume that we should
retry pNFS after a suitable timeout period.
The following patch sets a timeout of 2 minutes.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/pnfs.c
fs/nfs/pnfs.h

index f46f9bc4f767dc90e84364954ff0d25a6eea6ee6..2c59da5511db35448490666b119e5f089a71a3aa 100644 (file)
@@ -35,6 +35,7 @@
 #include "iostat.h"
 
 #define NFSDBG_FACILITY                NFSDBG_PNFS
+#define PNFS_LAYOUTGET_RETRY_TIMEOUT (120*HZ)
 
 /* Locking:
  *
@@ -248,6 +249,7 @@ pnfs_iomode_to_fail_bit(u32 iomode)
 static void
 pnfs_layout_io_set_failed(struct pnfs_layout_hdr *lo, u32 iomode)
 {
+       lo->plh_retry_timestamp = jiffies;
        set_bit(pnfs_iomode_to_fail_bit(iomode), &lo->plh_flags);
        dprintk("%s Setting layout IOMODE_%s fail bit\n", __func__,
                        iomode == IOMODE_RW ?  "RW" : "READ");
@@ -256,7 +258,18 @@ pnfs_layout_io_set_failed(struct pnfs_layout_hdr *lo, u32 iomode)
 static bool
 pnfs_layout_io_test_failed(struct pnfs_layout_hdr *lo, u32 iomode)
 {
-       return test_bit(pnfs_iomode_to_fail_bit(iomode), &lo->plh_flags) != 0;
+       unsigned long start, end;
+       if (test_bit(pnfs_iomode_to_fail_bit(iomode), &lo->plh_flags) == 0)
+               return false;
+       end = jiffies;
+       start = end - PNFS_LAYOUTGET_RETRY_TIMEOUT;
+       if (!time_in_range(lo->plh_retry_timestamp, start, end)) {
+               /* It is time to retry the failed layoutgets */
+               clear_bit(NFS_LAYOUT_RW_FAILED, &lo->plh_flags);
+               clear_bit(NFS_LAYOUT_RO_FAILED, &lo->plh_flags);
+               return false;
+       }
+       return true;
 }
 
 static void
index e3eb7d1b17a817f2283a929c55e3bbcc42404126..bc8e5001203daad169dd11f54d1a4dce91c21752 100644 (file)
@@ -140,6 +140,7 @@ struct pnfs_layout_hdr {
        atomic_t                plh_outstanding; /* number of RPCs out */
        unsigned long           plh_block_lgets; /* block LAYOUTGET if >0 */
        u32                     plh_barrier; /* ignore lower seqids */
+       unsigned long           plh_retry_timestamp;
        unsigned long           plh_flags;
        loff_t                  plh_lwb; /* last write byte for layoutcommit */
        struct rpc_cred         *plh_lc_cred; /* layoutcommit cred */