svn commit: r336573 - head/sys/fs/nfs

Rick Macklem rmacklem at FreeBSD.org
Sat Jul 21 01:33:08 UTC 2018


Author: rmacklem
Date: Sat Jul 21 01:33:07 2018
New Revision: 336573
URL: https://svnweb.freebsd.org/changeset/base/336573

Log:
  Set CLSET_TIMEOUT on TCP connections to pNFS DSs.
  
  Use CLSET_TIMEOUT to set the timeout for connections to DSs instead of
  specifying a timeout on each RPC. This is done so that SO_SNDTIMEO
  is set on the TCP socket as well as specifying a time limit when
  waiting for an RPC reply.  Useful if the send queue for the TCP
  connection has become constipated, due to a failed DS.
  The choice of lease_duration / 4 is fairly arbitrary, but seems to work
  ok, with a lower bound of 10sec.
  For client connections to a DS, set the retry limit to vfs.nfsd.dsretries,
  which is 2 by default.
  This patch should only affect pNFS connections to DSs.
  This patch requires r336542.
  
  MFC after:	2 weeks

Modified:
  head/sys/fs/nfs/nfs_commonkrpc.c

Modified: head/sys/fs/nfs/nfs_commonkrpc.c
==============================================================================
--- head/sys/fs/nfs/nfs_commonkrpc.c	Sat Jul 21 00:12:41 2018	(r336572)
+++ head/sys/fs/nfs/nfs_commonkrpc.c	Sat Jul 21 01:33:07 2018	(r336573)
@@ -98,6 +98,7 @@ extern int nfscl_ticks;
 extern void (*ncl_call_invalcaches)(struct vnode *);
 extern int nfs_numnfscbd;
 extern int nfscl_debuglevel;
+extern int nfsrv_lease;
 
 SVCPOOL		*nfscbd_pool;
 static int	nfsrv_gsscallbackson = 0;
@@ -105,6 +106,7 @@ static int	nfs_bufpackets = 4;
 static int	nfs_reconnects;
 static int	nfs3_jukebox_delay = 10;
 static int	nfs_skip_wcc_data_onerr = 1;
+static int	nfs_dsretries = 2;
 
 SYSCTL_DECL(_vfs_nfs);
 
@@ -116,6 +118,8 @@ SYSCTL_INT(_vfs_nfs, OID_AUTO, nfs3_jukebox_delay, CTL
     "Number of seconds to delay a retry after receiving EJUKEBOX");
 SYSCTL_INT(_vfs_nfs, OID_AUTO, skip_wcc_data_onerr, CTLFLAG_RW, &nfs_skip_wcc_data_onerr, 0,
     "Disable weak cache consistency checking when server returns an error");
+SYSCTL_INT(_vfs_nfs, OID_AUTO, dsretries, CTLFLAG_RW, &nfs_dsretries, 0,
+    "Number of retries for a DS RPC before failure");
 
 static void	nfs_down(struct nfsmount *, struct thread *, const char *,
     int, int);
@@ -298,6 +302,30 @@ newnfs_connect(struct nfsmount *nmp, struct nfssockreq
 			retries = INT_MAX;
 		if (NFSHASNFSV4N(nmp)) {
 			if (cred != NULL) {
+				if (NFSHASSOFT(nmp)) {
+					/*
+					 * This should be a DS mount.
+					 * Use CLSET_TIMEOUT to set the timeout
+					 * for connections to DSs instead of
+					 * specifying a timeout on each RPC.
+					 * This is done so that SO_SNDTIMEO
+					 * is set on the TCP socket as well
+					 * as specifying a time limit when
+					 * waiting for an RPC reply.  Useful
+					 * if the send queue for the TCP
+					 * connection has become constipated,
+					 * due to a failed DS.
+					 * The choice of lease_duration / 4 is
+					 * fairly arbitrary, but seems to work
+					 * ok, with a lower bound of 10sec.
+					 */
+					timo.tv_sec = nfsrv_lease / 4;
+					if (timo.tv_sec < 10)
+						timo.tv_sec = 10;
+					timo.tv_usec = 0;
+					CLNT_CONTROL(client, CLSET_TIMEOUT,
+					    &timo);
+				}
 				/*
 				 * Make sure the nfscbd_pool doesn't get
 				 * destroyed while doing this.
@@ -325,8 +353,18 @@ newnfs_connect(struct nfsmount *nmp, struct nfssockreq
 				 * not maintain open/lock state and is the
 				 * only case where using a "soft" mount is
 				 * recommended for NFSv4.
+				 * For mounts from the MDS to DS, this is done
+				 * via mount options, but that is not the case
+				 * here.  The retry limit here can be adjusted
+				 * via the sysctl vfs.nfs.dsretries.
+				 * See the comment above w.r.t. timeout.
 				 */
-				retries = 2;
+				timo.tv_sec = nfsrv_lease / 4;
+				if (timo.tv_sec < 10)
+					timo.tv_sec = 10;
+				timo.tv_usec = 0;
+				CLNT_CONTROL(client, CLSET_TIMEOUT, &timo);
+				retries = nfs_dsretries;
 			}
 		}
 	} else {


More information about the svn-src-all mailing list