J'ai un test d'application C ++ qui crée 10 000 fichiers dans un répertoire monté 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 10 000 autres fichiers. Cela peut être vu sur Linux Centos v4 ou v5 où le répertoire est monté NFS, mais pas sur la machine hôte où réside le disque.
Comment est-il même possible d'avoir deux fichiers du 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 l'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 d'inode (-i) montre que les deux copies ont la même entrée d'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 de répertoire soit en quelque sorte corrompue.
Mon application aurait-elle pu légitimement créer cette situation ou s'agit-il d'un bug dans le 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. Également 'umount' puis 'mount' du lecteur NFS qui a le problème ne le résout pas, l'entrée répétée reste après le remontage.
Mise à jour 1: j'ai maintenant 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 cette fois un inode différent, 213352984, pour les fichiers doublés. J'ajouterai également que le fichier est créé sur la machine Centos 5 sur laquelle le disque est hébergé, donc il est créé localement et affiché correctement localement, mais toutes les autres machines que NFS le monte voient l'entrée doublée.
Mise à jour 2: j'ai monté le lecteur sur une machine Centos v6 et j'ai trouvé les éléments suivants /var/log/messages
après avoir répertorié et vu la double entrée:
[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 trouvé que renommer le fichier fait disparaître la double entrée, mais le renommer en arrière la fait réapparaître doublé, ou alternativement, en touchant simplement un nouveau fichier avec le nom testfile03373
, une double entrée apparaît, mais cela ne se produit que dans le deux répertoires où cette double entrée a été vue.