svn commit: r336542 - head/sys/rpc
Rick Macklem
rmacklem at FreeBSD.org
Fri Jul 20 12:03:17 UTC 2018
Author: rmacklem
Date: Fri Jul 20 12:03:16 2018
New Revision: 336542
URL: https://svnweb.freebsd.org/changeset/base/336542
Log:
Set SO_SNDTIMEO in the client side krpc when CLSET_TIMEOUT is done.
During testing of the pNFS client, it was observed that an RPC could get
stuck in sosend() for a very long time if the network connection to a DS
had failed. This is fixed by setting SO_SNDTIMEO on the TCP socket.
This is only done when CLSET_TIMEOUT is done and this is not done by any
use of the krpc currently in the source tree, so there should be no effect
on extant uses.
A future patch will use CLSET_TIMEOUT for TCP connections to DSs.
Reviewed by: kib
MFC after: 2 weeks
Differential Revision: https://reviews.freebsd.org/D16293
Modified:
head/sys/rpc/clnt_rc.c
Modified: head/sys/rpc/clnt_rc.c
==============================================================================
--- head/sys/rpc/clnt_rc.c Fri Jul 20 07:16:28 2018 (r336541)
+++ head/sys/rpc/clnt_rc.c Fri Jul 20 12:03:16 2018 (r336542)
@@ -174,10 +174,26 @@ clnt_reconnect_connect(CLIENT *cl)
newclient = clnt_dg_create(so,
(struct sockaddr *) &rc->rc_addr, rc->rc_prog, rc->rc_vers,
rc->rc_sendsz, rc->rc_recvsz);
- else
+ else {
+ /*
+ * I do not believe a timeout of less than 1sec would make
+ * sense here since short delays can occur when a server is
+ * temporarily overloaded.
+ */
+ if (rc->rc_timeout.tv_sec > 0 && rc->rc_timeout.tv_usec >= 0) {
+ error = so_setsockopt(so, SOL_SOCKET, SO_SNDTIMEO,
+ &rc->rc_timeout, sizeof(struct timeval));
+ if (error != 0) {
+ stat = rpc_createerr.cf_stat = RPC_CANTSEND;
+ rpc_createerr.cf_error.re_errno = error;
+ td->td_ucred = oldcred;
+ goto out;
+ }
+ }
newclient = clnt_vc_create(so,
(struct sockaddr *) &rc->rc_addr, rc->rc_prog, rc->rc_vers,
rc->rc_sendsz, rc->rc_recvsz, rc->rc_intr);
+ }
td->td_ucred = oldcred;
if (!newclient) {
More information about the svn-src-all
mailing list