Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 22 Apr 1997 11:42:43 -0400 (EDT)
From:      Thomas David Rivers <ponds!rivers@dg-rtp.dg.com>
To:        ponds!nlsystems.com!dfr, ponds!lakes.water.net!rivers
Cc:        ponds!freebsd.org!freebsd-bugs
Subject:   Re: kern/3304: NFS V2 readdir hangs
Message-ID:  <199704221542.LAA04318@lakes.water.net>

next in thread | raw e-mail | index | archive | help
> 
> On Mon, 21 Apr 1997, Thomas David Rivers wrote:
> 
> > > I think the most promising candidate is the 'full socket buffers' message.
> > > Could you see if that goes up consistently when you prompt the system to
> > > hang.  The match between that and the reassembly number seems to show that
> > > these are large packets.
> > 
> >  We'll do!
> 
> I have been looking at the code again today and it seems to me that the
> client is not reserving enough space in its sockets when it initialises
> the mount.  Your nasty directory appears to generate a reply packet which
> is too large for the client to recieve.
> 
> I added some code to use a slightly less restrictive buffer size in the
> NFS client.  I also tidied up the code which sets the size for readdir
> requests to make it possible to set it to less than 4k and to be more
> compatible with 2.1.x.  Could you try this patch, both with and without a
> -r1024 argument to mount_nfs.


 I tried it out with a -r1024 (and -w1024, which shouldn't matter)
and without any options except -t60...

 It worked wonderfully!!!  I'd say commit that patch!!!  (thanks again)

 Now, I see you set the rcvreserve to "(nm_rsize + NFS_MAXPKTHDR) * 2"
which, for me was enough - but can we determine just what is 'really'
enough, or is this just a better guess?  [Is it guaranteed to be
enough because you bump the readdirsize down to the rsize is rsize 
is the lesser of the two?]

 	- Dave Rivers -

> 
> Index: nfs_socket.c
> ===================================================================
> RCS file: /home/ncvs/src/sys/nfs/nfs_socket.c,v
> retrieving revision 1.22
> diff -u -r1.22 nfs_socket.c
> --- nfs_socket.c	1997/03/22 06:53:08	1.22
> +++ nfs_socket.c	1997/04/22 13:31:23
> @@ -270,8 +270,8 @@
>  		so->so_snd.sb_timeo = 0;
>  	}
>  	if (nmp->nm_sotype == SOCK_DGRAM) {
> -		sndreserve = nmp->nm_wsize + NFS_MAXPKTHDR;
> -		rcvreserve = nmp->nm_rsize + NFS_MAXPKTHDR;
> +		sndreserve = (nmp->nm_wsize + NFS_MAXPKTHDR) * 2;
> +		rcvreserve = (nmp->nm_rsize + NFS_MAXPKTHDR) * 2;
>  	} else if (nmp->nm_sotype == SOCK_SEQPACKET) {
>  		sndreserve = (nmp->nm_wsize + NFS_MAXPKTHDR) * 2;
>  		rcvreserve = (nmp->nm_rsize + NFS_MAXPKTHDR) * 2;
> Index: nfs_vfsops.c
> ===================================================================
> RCS file: /home/ncvs/src/sys/nfs/nfs_vfsops.c,v
> retrieving revision 1.37
> diff -u -r1.37 nfs_vfsops.c
> --- nfs_vfsops.c	1997/04/04 17:49:30	1.37
> +++ nfs_vfsops.c	1997/04/22 13:04:47
> @@ -302,12 +302,9 @@
>  		}
>  		pref = fxdr_unsigned(u_long, fsp->fs_dtpref);
>  		if (pref < nmp->nm_readdirsize)
> -			nmp->nm_readdirsize = (pref + NFS_DIRBLKSIZ - 1) &
> -				~(NFS_DIRBLKSIZ - 1);
> +			nmp->nm_readdirsize = pref;
>  		if (max < nmp->nm_readdirsize) {
> -			nmp->nm_readdirsize = max & ~(NFS_DIRBLKSIZ - 1);
> -			if (nmp->nm_readdirsize == 0)
> -				nmp->nm_readdirsize = max;
> +			nmp->nm_readdirsize = max;
>  		}
>  		nmp->nm_flag |= NFSMNT_GOTFSINFO;
>  	}
> @@ -741,13 +738,11 @@
>  
>  	if ((argp->flags & NFSMNT_READDIRSIZE) && argp->readdirsize > 0) {
>  		nmp->nm_readdirsize = argp->readdirsize;
> -		/* Round down to multiple of blocksize */
> -		nmp->nm_readdirsize &= ~(NFS_DIRBLKSIZ - 1);
> -		if (nmp->nm_readdirsize < NFS_DIRBLKSIZ)
> -			nmp->nm_readdirsize = NFS_DIRBLKSIZ;
>  	}
>  	if (nmp->nm_readdirsize > maxio)
>  		nmp->nm_readdirsize = maxio;
> +	if (nmp->nm_readdirsize > nmp->nm_rsize)
> +		nmp->nm_readdirsize = nmp->nm_rsize;
>  
>  	if ((argp->flags & NFSMNT_MAXGRPS) && argp->maxgrouplist >= 0 &&
>  		argp->maxgrouplist <= NFS_MAXGRPS)
> 
> 
> 
> --
> Doug Rabson				Mail:  dfr@nlsystems.com
> Nonlinear Systems Ltd.			Phone: +44 181 951 1891
> 
> 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199704221542.LAA04318>