Eu tenho um teste de aplicativo C ++ que cria 10.000 arquivos em um diretório NFS montado, mas meu teste falhou recentemente uma vez devido a um arquivo que aparece duas vezes com o mesmo nome nesse diretório com todos os outros 10.000 arquivos. Isso pode ser visto no Linux Centos v4 ou v5, onde o diretório é montado pelo NFS, mas não na máquina onde o disco reside.
Como é possível ter dois arquivos com o mesmo nome no mesmo diretório?
[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*
Executando o script Perl sugerido em uma das respostas abaixo:
ls -la *03373* | perl -e 'while(<>){chomp();while(/(.)/g){$c=$1;if($c=~/[!-~]/){print("$c");}else{printf("\x%.2x",ord($c));}}print("\n");}'
dá:
-rwx------\x20\x201\x20user\x20root\x203373\x20Sep\x20\x203\x2003:23\x20testfile03373*
-rwx------\x20\x201\x20user\x20root\x203373\x20Sep\x20\x203\x2003:23\x20testfile03373*
Imprimir com os valores de inode (-i) mostra que as duas cópias têm a mesma entrada de 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*
Parece que a entrada do diretório está corrompida de alguma forma.
Poderia meu aplicativo ter criado legitimamente essa situação ou isso é um bug no sistema operacional? Existe alguma coisa que eu possa fazer para me proteger contra isso no meu programa que cria os arquivos?
Estou pensando que há algum tipo de bug no software de montagem do NFS. Também 'umount' e, em seguida, 'mount' da unidade NFS que tem o problema não a resolve, a entrada repetida permanece após a remontação.
Atualização 1: Eu agora acertei essa edição uma segunda vez, algumas horas depois, e a coisa realmente estranha é que aconteceu exatamente no mesmo arquivo, testfile03373
, embora tenha sido um inode diferente desta vez, 213352984, para os arquivos duplicados. Eu também vou acrescentar que o arquivo está sendo criado na máquina Centos 5 onde o disco está sendo hospedado, então ele está sendo criado localmente, e mostrando correto localmente, mas todas as outras máquinas que o NFS monta estão vendo a entrada duplicada. / p>
Atualização 2: montei a unidade em uma máquina Centos v6 e encontrei o seguinte em /var/log/messages
após listar e ver a entrada dupla lá:
[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
Além disso, descobri que renomear o arquivo faz com que a entrada dupla desapareça, mas renomeá-lo faz com que reapareça duplicado ou, alternativamente, apenas tocar em um novo arquivo com o nome testfile03373
, faz com que uma entrada dupla apareça mas isso só acontece nos dois diretórios onde esta dupla entrada foi vista.