Ho un test dell'applicazione C ++ che crea 10.000 file in una directory montata NFS, ma il mio test recentemente non è riuscito una volta a causa di un file che appare due volte con lo stesso nome in quella directory con tutti gli altri 10.000 file. Questo può essere visto su Linux Centos v4 o v5 in cui è montata la directory NFS, ma non sul computer host in cui risiede il disco.
Come è possibile anche avere due file con lo stesso nome nella stessa directory?
[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*
Esecuzione dello script Perl suggerito in una delle risposte seguenti:
ls -la *03373* | perl -e 'while(<>){chomp();while(/(.)/g){$c=$1;if($c=~/[!-~]/){print("$c");}else{printf("\\x%.2x",ord($c));}}print("\n");}'
dà:
-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 stampa con i valori di inode (-i) mostra che le due copie hanno la stessa voce di 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*
Sembrerebbe che la voce della directory sia in qualche modo danneggiata.
La mia applicazione potrebbe aver legittimamente creato questa situazione o si tratta di un bug nel sistema operativo? C'è qualcosa che posso fare per proteggermi dal mio programma che crea i file?
Sto pensando che ci sia una specie di bug nel software di montaggio NFS. Anche 'umount' e quindi 'mount' dell'unità NFS che presenta il problema non lo risolvono, la voce ripetuta rimane dopo il rimontaggio.
Aggiornamento 1: ora ho riscontrato questo problema una seconda volta, poche ore dopo, e la cosa davvero strana è che è successo nello stesso file esatto testfile03373
, anche se questa volta ha ottenuto un inode diverso, 213352984, per i file raddoppiati. Aggiungerò anche che il file viene creato sulla macchina Centos 5 in cui è ospitato il disco, quindi viene creato localmente e mostra correttamente localmente, ma tutte le altre macchine che NFS lo montano vedono la voce raddoppiata.
Aggiornamento 2: ho montato l'unità su una macchina Centos v6 e ho trovato quanto segue /var/log/messages
dopo l'elenco e vedendo la doppia voce lì:
[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
Inoltre, ho scoperto che rinominare il file fa scomparire la doppia voce, ma rinominandolo fa sì che riappaia raddoppiato o, in alternativa, semplicemente toccando un nuovo file con il nome testfile03373
, appare una doppia voce, ma ciò accade solo nel due directory in cui è stata vista questa doppia voce.