Tengo una prueba de aplicación C ++ que crea 10,000 archivos en un directorio montado en NFS, pero mi prueba recientemente falló una vez debido a que un archivo aparece dos veces con el mismo nombre en ese directorio con todos los otros 10,000 archivos. Esto se puede ver en Linux Centos v4 o v5 donde el directorio está montado en NFS, pero no en la máquina host donde reside el disco.
¿Cómo es posible tener dos archivos con el mismo nombre en el mismo directorio?
[centos4x32 destination] ls -al ./testfile03373
-rwx------ 1 user root 3373 Sep 3 03:23 ./testfile03373*
[centos4x32 destination] ls -al ./testfile03373*
-rwx------ 1 user root 3373 Sep 3 03:23 ./testfile03373*
-rwx------ 1 user root 3373 Sep 3 03:23 ./testfile03373*
[centos4x32 destination] ls -al *testfile03373
-rwx------ 1 user root 3373 Sep 3 03:23 testfile03373*
-rwx------ 1 user root 3373 Sep 3 03:23 testfile03373*
[centos4x32 destination] ls -alb test*file03373
-rwx------ 1 user root 3373 Sep 3 03:23 testfile03373*
-rwx------ 1 user root 3373 Sep 3 03:23 testfile03373*
Ejecutar el script Perl sugerido en una de las respuestas a continuación:
ls -la *03373* | perl -e 'while(<>){chomp();while(/(.)/g){$c=$1;if($c=~/[!-~]/){print("$c");}else{printf("\\x%.2x",ord($c));}}print("\n");}'
da:
-rwx------\x20\x201\x20user\x20root\x203373\x20Sep\x20\x203\x2003:23\x20testfile03373*
-rwx------\x20\x201\x20user\x20root\x203373\x20Sep\x20\x203\x2003:23\x20testfile03373*
La impresión con los valores de inodo (-i) muestra que las dos copias tienen la misma entrada de inodo (36733444):
[h3-centos4x32 destination] ls -alib te*stfile03373
36733444 -rwx------ 1 user root 3373 Sep 3 03:23 testfile03373*
36733444 -rwx------ 1 user root 3373 Sep 3 03:23 testfile03373*
Parece que la entrada del directorio está dañada de alguna manera.
¿Podría mi aplicación haber creado legítimamente esta situación o es un error en el sistema operativo? ¿Hay algo que pueda hacer para proteger contra esto en mi programa que crea los archivos?
Estoy pensando que hay algún tipo de error en el software de montaje NFS. También 'umount' y luego 'mount' de la unidad NFS que tiene el problema no lo resuelve, la entrada repetida permanece después del remontaje.
Actualización 1: ahora he tocado este problema por segunda vez, unas horas más tarde, y lo realmente extraño es que sucedió exactamente en el mismo archivo testfile03373
, aunque esta vez obtuvo un inodo diferente, 213352984, para los archivos duplicados. También agregaré que el archivo se está creando en la máquina Centos 5 donde se aloja el disco, por lo que se está creando localmente y se muestra correctamente localmente, pero todas las otras máquinas que NFS lo montan están viendo la entrada duplicada.
Actualización 2: monté el disco en una máquina Centos v6 y encontré lo siguiente /var/log/messages
después de enumerar y ver la doble entrada allí:
[root@c6x64 double3373file]# ls -laiB testfile03373* ; tail -3 /var/log/messages
36733444 -rwx------. 1 user root 3373 Sep 3 03:23 testfile03373
36733444 -rwx------. 1 user root 3373 Sep 3 03:23 testfile03373
...
Sep 4 14:59:46 c6x64 kernel: NFS: directory user/double3373file contains a readdir loop.Please contact your server vendor. The file: testfile03373 has duplicate cookie 7675190874049154909
Sep 4 14:59:46 c6x64 kernel: NFS: directory user/double3373file contains a readdir loop.Please contact your server vendor. The file: testfile03373 has duplicate cookie 7675190874049154909
Además, descubrí que cambiar el nombre del archivo hace que la doble entrada desaparezca, pero cambiar el nombre de nuevo hace que vuelva a aparecer duplicado, o alternativamente, solo tocar un nuevo archivo con el nombre testfile03373
, hace que aparezca una doble entrada, pero esto solo sucede en el dos directorios donde se ha visto esta doble entrada.