У мене є тест додатків 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", а потім "кріплення" накопичувача NFS, який має проблему, не вирішує це питання, повторний запис залишається після повторної перезавантаження.
Оновлення 1: Зараз я потрапив у цю проблему вдруге, через кілька годин, і справді дивна річ, що це трапилося в точно такому ж файлі testfile03373
, хоча цей раз отримав інший уклад, 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
, викликає появу подвійного запису, але це відбувається лише в два довідники, де був помічений цей подвійний запис.