J'ai un test d'application C++ qui crée 10 000 fichiers dans un répertoire monté par NFS, mais mon test a récemment échoué une fois en raison d'un fichier apparaissant deux fois avec le même nom dans ce répertoire avec tous les autres 10 000 fichiers. Ce problème peut être observé sur Linux Centos v4 ou v5 où le répertoire est monté sur NFS, mais pas sur la machine hôte où réside le disque.
Comment est-il possible d'avoir deux fichiers portant le même nom dans le même répertoire ?
[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*
Exécuter le script Perl suggéré dans une des réponses ci-dessous :
ls -la *03373* | perl -e 'while(<>){chomp();while(/(.)/g){$c=$1;if($c=~/[!-~]/){print("$c");}else{printf("\\x%.2x",ord($c));}}print("\n");}'
donne :
-rwx------\x20\x201\x20user\x20root\x203373\x20Sep\x20\x203\x2003:23\x20testfile03373*
-rwx------\x20\x201\x20user\x20root\x203373\x20Sep\x20\x203\x2003:23\x20testfile03373*
L'impression avec les valeurs inode (-i) montre que les deux copies ont la même entrée inode (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*
Il semblerait que l'entrée du répertoire soit corrompue d'une manière ou d'une autre.
Mon application aurait-elle pu légitimement créer cette situation ou s'agit-il d'un bug du système d'exploitation ? Y a-t-il quelque chose que je puisse faire pour me protéger contre cela dans mon programme qui crée les fichiers ?
Je pense qu'il y a une sorte de bogue dans le logiciel de montage NFS. De même, le fait d'effectuer un " umount " puis un " mount " sur le lecteur NFS qui présente le problème ne le résout pas, l'entrée répétée subsiste après le remontage.
Mise à jour 1 : J'ai rencontré ce problème une deuxième fois, quelques heures plus tard, et ce qui est vraiment étrange, c'est que cela s'est produit sur le même fichier, testfile03373
bien qu'il ait obtenu un inode différent cette fois, 213352984, pour les fichiers doublés. J'ajouterai également que le fichier est créé sur la machine Centos 5 où le disque est hébergé, il est donc créé localement et s'affiche correctement localement, mais toutes les autres machines qui le montent par NFS voient l'entrée doublée.
Mise à jour 2 : J'ai monté le lecteur sur une machine Centos v6 et j'ai trouvé ce qui suit dans le fichier /var/log/messages
après l'avoir listé et avoir vu la double entrée à cet endroit :
[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
De plus, j'ai découvert que renommer le fichier fait disparaître la double entrée, mais le renommer à nouveau la fait réapparaître en double, ou alternativement, il suffit de toucher un nouveau fichier avec le nom testfile03373
provoque l'apparition d'une double entrée, mais cela ne se produit que dans les deux répertoires où cette double entrée a été vue.