Mam test aplikacji C ++, który tworzy 10 000 plików w katalogu zamontowanym w systemie plików NFS, ale mój test niedawno się nie udał, ponieważ jeden plik pojawił się dwa razy o tej samej nazwie w tym katalogu z wszystkimi pozostałymi 10 000 plików. Można to zobaczyć na Linux Centos v4 lub v5, gdzie katalog jest podłączony do NFS, ale nie na komputerze hosta, na którym znajduje się dysk.
Jak można w ogóle mieć dwa pliki o tej samej nazwie w tym samym katalogu?
[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*
Uruchomienie skryptu Perl sugerowane w jednej z poniższych odpowiedzi:
ls -la *03373* | perl -e 'while(<>){chomp();while(/(.)/g){$c=$1;if($c=~/[!-~]/){print("$c");}else{printf("\\x%.2x",ord($c));}}print("\n");}'
daje:
-rwx------\x20\x201\x20user\x20root\x203373\x20Sep\x20\x203\x2003:23\x20testfile03373*
-rwx------\x20\x201\x20user\x20root\x203373\x20Sep\x20\x203\x2003:23\x20testfile03373*
Drukowanie z wartościami i-węzła (-i) pokazuje, że dwie kopie mają ten sam wpis i-węzła (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*
Wygląda na to, że wpis w katalogu jest jakoś uszkodzony.
Czy moja aplikacja mogła zgodnie z prawem stworzyć tę sytuację, czy jest to błąd w systemie operacyjnym? Czy mogę coś zrobić, aby zabezpieczyć się przed tym w moim programie, który tworzy pliki?
Myślę, że w oprogramowaniu do montażu NFS jest jakiś błąd. Również „umount”, a następnie „mount” dysku NFS, który ma problem, nie rozwiązuje go, powtarzający się wpis pozostaje po ponownym zamontowaniu.
Aktualizacja 1: Znalazłem ten problem po raz drugi, kilka godzin później, i naprawdę dziwne jest to, że wydarzyło się to dokładnie w tym samym pliku testfile03373
, chociaż tym razem otrzymało inną i-węzeł, 213352984, dla plików podwójnych. Dodam też, że plik jest tworzony na komputerze Centos 5, na którym dysk jest hostowany, więc jest tworzony lokalnie i pokazuje się poprawnie lokalnie, ale wszystkie inne maszyny, które go zamontowały, widzą podwójny wpis.
Aktualizacja 2: Zamontowałem dysk na maszynie Centos v6 i znalazłem następujące informacje /var/log/messages
po wyświetleniu listy i zobaczeniu tam podwójnego wpisu:
[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
Ponadto odkryłem, że zmiana nazwy pliku powoduje zniknięcie podwójnego wpisu, ale zmiana nazwy powoduje jego ponowne pojawienie się podwójnie lub, alternatywnie, po prostu dotknięcie nowego pliku o nazwie testfile03373
powoduje wyświetlenie podwójnego wpisu, ale zdarza się to tylko w dwa katalogi, w których widać ten podwójny wpis.