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>