NFSv4 client's BUG?

Wei Yongjun yjwei at cn.fujitsu.com
Tue Jul 1 20:39:16 EDT 2008


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.


> -----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
>   



More information about the NFSv4 mailing list