nfsd: Reduce the callback timeout to 800msec

Recent discussion on the nfsv4@ietf.org mailing list confirmed
that an NFSv4 server should reply to an RPC in less than 1second.
If an NFSv4 RPC requires a delegation be recalled,
the server will attempt a CB_RECALL callback.
If the client is not responsive, the RPC reply will be delayed
until the callback times out.
Without this patch, the timeout is set to 4 seconds (set in
ticks, but used as seconds), resulting in the RPC reply taking over 4sec.
This patch redefines the constant as being in milliseconds and it
implements that for a value of 800msec, to ensure the RPC
reply is sent in less than 1second.

This patch only affects mounts from clients when delegations
are enabled on the server and the client is unresponsive to callbacks.

MFC after:	2 weeks
This commit is contained in:
Rick Macklem 2021-05-18 16:17:58 -07:00
parent b3d4c70dc6
commit fc0dc94029
2 changed files with 7 additions and 5 deletions

View File

@ -50,7 +50,7 @@
#define NFS_MAXRCVTIMEO 60 /* 1 minute in seconds */ #define NFS_MAXRCVTIMEO 60 /* 1 minute in seconds */
#define NFS_MINIDEMTIMEO (5 * NFS_HZ) /* Min timeout for non-idempotent ops*/ #define NFS_MINIDEMTIMEO (5 * NFS_HZ) /* Min timeout for non-idempotent ops*/
#define NFS_MAXREXMIT 100 /* Stop counting after this many */ #define NFS_MAXREXMIT 100 /* Stop counting after this many */
#define NFSV4_CALLBACKTIMEO (2 * NFS_HZ) /* Timeout in ticks */ #define NFSV4_CALLBACKTIMEO 800 /* Timeout in msec */
#define NFSV4_CALLBACKRETRY 5 /* Number of retries before failure */ #define NFSV4_CALLBACKRETRY 5 /* Number of retries before failure */
#define NFSV4_SLOTS 64 /* Number of slots, fore channel */ #define NFSV4_SLOTS 64 /* Number of slots, fore channel */
#define NFSV4_CBSLOTS 8 /* Number of slots, back channel */ #define NFSV4_CBSLOTS 8 /* Number of slots, back channel */

View File

@ -767,11 +767,13 @@ newnfs_request(struct nfsrv_descript *nd, struct nfsmount *nmp,
* use the same xid. * use the same xid.
*/ */
if (nmp == NULL) { if (nmp == NULL) {
timo.tv_usec = 0; if (clp == NULL) {
if (clp == NULL)
timo.tv_sec = NFSV4_UPCALLTIMEO; timo.tv_sec = NFSV4_UPCALLTIMEO;
else timo.tv_usec = 0;
timo.tv_sec = NFSV4_CALLBACKTIMEO; } else {
timo.tv_sec = NFSV4_CALLBACKTIMEO / 1000;
timo.tv_usec = NFSV4_CALLBACKTIMEO * 1000;
}
} else { } else {
if (nrp->nr_sotype != SOCK_DGRAM) { if (nrp->nr_sotype != SOCK_DGRAM) {
timo.tv_usec = 0; timo.tv_usec = 0;