svn commit: r336544 - projects/pnfs-planb-server/sys/fs/nfs

Rick Macklem rmacklem at FreeBSD.org
Fri Jul 20 12:38:09 UTC 2018


Author: rmacklem
Date: Fri Jul 20 12:38:07 2018
New Revision: 336544
URL: https://svnweb.freebsd.org/changeset/base/336544

Log:
  Update the comments and add a sysctl to set the retry limit for connections
  from clients to DSs. This is for the client side pNFS and head/current will
  be getting this commit soon.

Modified:
  projects/pnfs-planb-server/sys/fs/nfs/nfs_commonkrpc.c

Modified: projects/pnfs-planb-server/sys/fs/nfs/nfs_commonkrpc.c
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfs/nfs_commonkrpc.c	Fri Jul 20 12:32:17 2018	(r336543)
+++ projects/pnfs-planb-server/sys/fs/nfs/nfs_commonkrpc.c	Fri Jul 20 12:38:07 2018	(r336544)
@@ -106,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);
 
@@ -117,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);
@@ -303,14 +306,20 @@ newnfs_connect(struct nfsmount *nmp, struct nfssockreq
 			if (cred != NULL) {
 				if (NFSHASSOFT(nmp)) {
 					/*
-					 * This should be a DS mount.  If the
-					 * timeout is set to 1/4th of the lease
-					 * duration, the DS should be disabled
-					 * at approximately 1/2 lease duration,
-					 * due to a retry count of 2.
-					 * This will hopefully cause the client
-					 * to continue without the disabled
-					 * DS in less than the lease duration.
+					 * 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)
@@ -346,6 +355,10 @@ 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.
 				 */
 				timo.tv_sec = nfsrv_lease / 4;
@@ -353,7 +366,7 @@ newnfs_connect(struct nfsmount *nmp, struct nfssockreq
 					timo.tv_sec = 10;
 				timo.tv_usec = 0;
 				CLNT_CONTROL(client, CLSET_TIMEOUT, &timo);
-				retries = 2;
+				retries = nfs_dsretries;
 			}
 		}
 	} else {


More information about the svn-src-projects mailing list