NFSv4 client's BUG?

J. Bruce Fields bfields at fieldses.org
Tue Jul 1 20:49:19 EDT 2008


On Wed, Jul 02, 2008 at 08:39:16AM +0800, Wei Yongjun wrote:
> Ellard, Daniel wrote:
> > You're never closing filedes[i], and eventually you're running out of
> > file descriptors.
> >
> > Add 
> >
> > 	close(filedes[i]);
> >
> > After
> >
> > 	write(filedes[i], "...
> >   
> 
> This is not the problem. Because I used ulimit -n 5000 to let program 
> can open 5000 files.
> The "fopen: Input/output error" may happend when I just open 40 files, 
> it is random.

What's the server?  Could you watch the traffic in wireshark and see
whether the server is returning an error on the failing open?

--b.

> 
> 
> > -----Original Message-----
> > From: Wei Yongjun [mailto:yjwei at cn.fujitsu.com] 
> > Sent: Tuesday, July 01, 2008 6:08 AM
> > To: nfsv4 at linux-nfs.org
> > Subject: NFSv4 client's BUG?
> >
> > I have the following test program, but when it run, fopen may return
> > EIO, is this a bug of NFSv4 client?
> > NFSv4 client is 2.6.26-rc6.
> >
> > -------------------------tstfopen.c-------------------------------------
> >
> > #include <stdio.h>
> > #include <error.h>
> > #include <stdlib.h>
> > #include <string.h>
> >
> > char * fname;
> > #define TEMPLATE "HighInodeXXXXXX"
> > int main(int argc, char *argv[]) {
> >         FILE *fp;
> >         char filename[4096];
> >         int filedes[4096];
> >         int i;
> >
> >         if (argc != 2) {
> >                 printf("Usage: %s filename\n", argv[0]);
> >                 exit(1);
> >         }
> >
> >         fname = argv[1];
> >
> >         for (i = 0; i < 4096; i++) {
> >                 if (i % 100 == 0)
> >                         printf("i = %d\n", i);
> >
> >                 strcpy(filename, TEMPLATE);
> >                 if ((filedes[i] = mkstemp(filename)) == -1) {
> >                         perror("mkstemp");
> >                         exit(0);
> >                 }
> >
> >                 if ((fp = fopen(fname, "w+")) == NULL) {
> >                         perror("fopen");
> >                         exit(0);
> >                 }
> >
> >                 if (fprintf(fp, "this is a test %d\n", i) == 0) {
> >                         perror("fprintf");
> >                         exit(0);
> >                 }
> >
> >                 fclose(fp);
> >                 write(filedes[i], "abcdef!!!\n",23);
> >         }
> >
> >         return 0;
> > }
> >
> >
> > ---------------------------tstmain.sh------------------------------
> > umount /mnt
> > killall /root/tstfopen
> >
> > ulimit -n 5000
> >
> > mount -t nfs4 NFS4SERVER:/ /mnt
> >
> > cd /mnt
> >
> > /root/tstfopen debug_file &
> >
> > CNT=1
> > while [ $CNT -lt 1000 ];
> > do
> >         cat debug_file
> >         TSTR=`cat debug_file`
> >         if [ "$TSTR" = "$LTSTR" ]; then
> >                 break
> >         fi
> >         LTSTR=$TSTR
> >         sleep 1
> >         CNT=$((CNT+1))
> > done
> >
> > rm -rf /mnt/*
> >
> > cd -
> >
> > umount /mnt
> > -----------------------------------end----------------------------
> >
> >
> > Usage:
> >     #cd /root
> >     #gcc tstfopen.c -o tstfopen
> >     #sh tstmain.sh
> >
> > The output may be like this:
> > i = 0
> > this is a test 0
> > this is a test 63
> > ...
> > i = 1400
> > this is a test 1410
> > this is a test 1415
> > this is a test 1438
> > fopen: Input/output error
> >   
> 
> _______________________________________________
> NFSv4 mailing list
> NFSv4 at linux-nfs.org
> http://linux-nfs.org/cgi-bin/mailman/listinfo/nfsv4


More information about the NFSv4 mailing list