Tôi có một thử nghiệm ứng dụng C ++ tạo ra 10.000 tệp trong thư mục được gắn NFS, nhưng thử nghiệm của tôi gần đây đã thất bại một lần do một tệp xuất hiện hai lần với cùng tên trong thư mục đó với tất cả 10.000 tệp khác. Điều này có thể được nhìn thấy trên Linux Centos v4 hoặc v5 nơi thư mục được gắn NFS, nhưng không phải trên máy chủ lưu trữ đĩa.
Làm thế nào thậm chí có thể có hai tệp có cùng tên trong cùng một thư mục?
[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*
Chạy tập lệnh Perl được đề xuất trong một trong các câu trả lời dưới đây:
ls -la *03373* | perl -e 'while(<>){chomp();while(/(.)/g){$c=$1;if($c=~/[!-~]/){print("$c");}else{printf("\\x%.2x",ord($c));}}print("\n");}'
cho:
-rwx------\x20\x201\x20user\x20root\x203373\x20Sep\x20\x203\x2003:23\x20testfile03373*
-rwx------\x20\x201\x20user\x20root\x203373\x20Sep\x20\x203\x2003:23\x20testfile03373*
In bằng các giá trị inode (-i) cho thấy hai bản sao có cùng mục nhập 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*
Có vẻ như mục nhập thư mục bị hỏng bằng cách nào đó.
Ứng dụng của tôi có thể tạo ra tình huống này một cách hợp pháp hay đây là một lỗi trong hệ điều hành? Có bất cứ điều gì tôi có thể làm để bảo vệ chống lại điều này trong chương trình tạo các tệp này không?
Tôi nghĩ rằng có một số loại lỗi trong phần mềm gắn NFS. Ngoài ra 'umount' và sau đó 'mount' của ổ đĩa NFS có vấn đề không giải quyết được, mục nhập lặp lại vẫn còn sau khi kết thúc.
Cập nhật 1: Bây giờ tôi đã gặp sự cố này lần thứ hai, một vài giờ sau đó và điều thực sự kỳ lạ là nó đã xảy ra trên cùng một tệp testfile03373
, mặc dù lần này nó có một nút inode khác, 213352984, cho các tệp được nhân đôi. Tôi cũng sẽ thêm rằng tệp đang được tạo trên máy Centos 5 nơi đĩa đang được lưu trữ, vì vậy nó đang được tạo cục bộ và hiển thị chính xác cục bộ, nhưng tất cả các máy khác mà NFS gắn kết đều nhìn thấy mục nhập được nhân đôi.
Cập nhật 2: Tôi đã gắn ổ đĩa trên máy Centos v6 và tìm thấy mục sau đây /var/log/messages
sau khi liệt kê và thấy mục nhập kép ở đó:
[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
Ngoài ra, tôi thấy rằng việc đổi tên tệp làm cho mục nhập kép biến mất, nhưng việc đổi tên lại khiến nó xuất hiện lại gấp đôi, hoặc thay vào đó, chỉ cần chạm vào một tệp mới có tên testfile03373
, khiến mục nhập kép xuất hiện, nhưng điều này chỉ xảy ra trong hai thư mục mà mục nhập kép này đã được nhìn thấy.