Ich habe einen C ++ - Anwendungstest, bei dem 10.000 Dateien in einem von NFS bereitgestellten Verzeichnis erstellt werden. Mein Test ist jedoch kürzlich einmal fehlgeschlagen, da eine Datei zweimal mit demselben Namen in diesem Verzeichnis mit allen anderen 10.000 Dateien angezeigt wurde. Dies kann entweder unter Linux Centos v4 oder v5 angezeigt werden, wo das Verzeichnis NFS-gemountet ist, jedoch nicht auf dem Host-Computer, auf dem sich die Festplatte befindet.
Wie ist es überhaupt möglich, zwei Dateien mit demselben Namen im selben Verzeichnis zu haben?
[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*
Ausführen des in einer der folgenden Antworten vorgeschlagenen Perl-Skripts:
ls -la *03373* | perl -e 'while(<>){chomp();while(/(.)/g){$c=$1;if($c=~/[!-~]/){print("$c");}else{printf("\\x%.2x",ord($c));}}print("\n");}'
gibt:
-rwx------\x20\x201\x20user\x20root\x203373\x20Sep\x20\x203\x2003:23\x20testfile03373*
-rwx------\x20\x201\x20user\x20root\x203373\x20Sep\x20\x203\x2003:23\x20testfile03373*
Das Drucken mit den Inode (-i) -Werten zeigt, dass die beiden Kopien denselben Inode-Eintrag haben (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*
Es scheint, dass der Verzeichniseintrag irgendwie beschädigt ist.
Könnte meine Anwendung diese Situation legitimerweise verursacht haben oder ist dies ein Fehler im Betriebssystem? Kann ich in meinem Programm, das die Dateien erstellt, etwas dagegen tun?
Ich denke, es gibt einen Fehler in der NFS-Montagesoftware. Auch 'umount' und dann 'mount' des NFS-Laufwerks, bei dem das Problem auftritt, beheben es nicht. Der wiederholte Eintrag bleibt nach dem erneuten Bereitstellen erhalten.
Update 1: Ich habe dieses Problem jetzt ein zweites Mal, einige Stunden später, festgestellt, und das wirklich Seltsame ist, dass es in genau derselben Datei passiert ist testfile03373
, obwohl es diesmal einen anderen Inode hat, 213352984, für die doppelten Dateien. Ich werde auch hinzufügen, dass die Datei auf dem Centos 5-Computer erstellt wird, auf dem die Festplatte gehostet wird. Sie wird also lokal erstellt und lokal korrekt angezeigt, aber auf allen anderen Computern, auf denen NFS sie bereitstellt, wird der doppelte Eintrag angezeigt.
Update 2: Ich habe das Laufwerk auf einem Centos v6-Computer bereitgestellt und /var/log/messages
nach dem Auflisten und Anzeigen des doppelten Eintrags Folgendes gefunden :
[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
Außerdem habe ich festgestellt, dass beim Umbenennen der Datei der doppelte Eintrag verschwindet, beim Umbenennen jedoch wieder doppelt angezeigt wird. Wenn Sie alternativ nur eine neue Datei mit dem Namen berühren testfile03373
, wird ein doppelter Eintrag angezeigt. Dies geschieht jedoch nur in der zwei Verzeichnisse, in denen dieser doppelte Eintrag gesehen wurde.