ฉันมีการทดสอบแอปพลิเคชัน C ++ ที่สร้าง 10,000 ไฟล์ในไดเรกทอรีที่เมาท์ NFS แต่การทดสอบของฉันล้มเหลวเมื่อเร็ว ๆ นี้เนื่องจากไฟล์หนึ่งปรากฏสองครั้งด้วยชื่อเดียวกันในไดเรกทอรีนั้นและอีก 10,000 ไฟล์ทั้งหมด สิ่งนี้สามารถเห็นได้บน Linux Centos v4 หรือ v5 โดยที่ไดเร็กทอรีนั้นถูกเมาท์ NFS แต่ไม่ใช่บนเครื่องโฮสต์ที่ดิสก์อยู่
เป็นไปได้ยังไงที่จะมีสองไฟล์ที่มีชื่อเดียวกันในไดเรกทอรีเดียวกัน?
[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*
เรียกใช้สคริปต์ Perl ที่แนะนำในหนึ่งในคำตอบด้านล่าง:
ls -la *03373* | perl -e 'while(<>){chomp();while(/(.)/g){$c=$1;if($c=~/[!-~]/){print("$c");}else{printf("\\x%.2x",ord($c));}}print("\n");}'
ให้:
-rwx------\x20\x201\x20user\x20root\x203373\x20Sep\x20\x203\x2003:23\x20testfile03373*
-rwx------\x20\x201\x20user\x20root\x203373\x20Sep\x20\x203\x2003:23\x20testfile03373*
การพิมพ์ด้วยค่า inode (-i) แสดงว่าสำเนาสองชุดมีรายการ 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*
ดูเหมือนว่ารายการไดเรกทอรีจะเสียหายอย่างใด
แอปพลิเคชันของฉันสามารถสร้างสถานการณ์นี้ได้อย่างถูกกฎหมายหรือเป็นข้อบกพร่องในระบบปฏิบัติการหรือไม่ มีสิ่งใดบ้างที่ฉันสามารถทำได้เพื่อป้องกันสิ่งนี้ในโปรแกรมที่สร้างไฟล์
ฉันคิดว่ามีข้อผิดพลาดบางอย่างในซอฟต์แวร์ยึด NFS นอกจากนี้ 'umount' และ 'mount' ของไดรฟ์ NFS ที่มีปัญหาไม่สามารถแก้ไขได้
อัปเดต 1:ตอนนี้ฉันได้ตีปัญหานี้ครั้งที่สองไม่กี่ชั่วโมงต่อมาและสิ่งที่แปลกจริงๆคือมันเกิดขึ้นในไฟล์เดียวกันtestfile03373
แม้ว่ามันจะมี inode ที่แตกต่างกันในเวลานี้คือ 213352984 สำหรับไฟล์สองเท่า ฉันจะเพิ่มว่าไฟล์นั้นถูกสร้างขึ้นบนเครื่อง Centos 5 ที่มีการโฮสต์ดิสก์ดังนั้นมันจึงถูกสร้างขึ้นในเครื่องและแสดงให้ถูกต้องภายในเครื่อง แต่เครื่องอื่น ๆ ทั้งหมดที่ NFS ติดตั้งจะเห็นรายการสองเท่า
อัปเดต 2:ฉันติดตั้งไดรฟ์บนเครื่อง Centos v6 และพบสิ่งต่อไปนี้ใน/var/log/messages
หลังจากรายการและเห็นรายการที่นั่น:
[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
นอกจากนี้ฉันพบว่าการเปลี่ยนชื่อไฟล์จะทำให้รายการสองรายการหายไป แต่การเปลี่ยนชื่อกลับเป็นสาเหตุให้รายการนั้นปรากฏขึ้นสองเท่าหรืออีกทางหนึ่งเพียงแค่สัมผัสไฟล์ใหม่ที่มีชื่อtestfile03373
ทำให้รายการสองรายการปรากฏขึ้น แต่สิ่งนี้เกิดขึ้นใน สองไดเร็กทอรีที่เห็นรายการคู่นี้