Eu tenho um teste de aplicativo C ++ que cria 10.000 arquivos em um diretório montado pelo NFS, mas meu teste falhou recentemente uma vez devido a um arquivo aparecer 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 está montado pelo NFS, mas não na máquina host em que 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*
A impressão 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.
Meu aplicativo poderia ter criado legitimamente essa situação ou isso é um bug no sistema operacional? Existe algo 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 NFS. Além disso, 'umount' e, em seguida, 'mount' da unidade NFS com o problema não resolvem, a entrada repetida permanece após a remontagem.
Atualização 1: Eu já peguei esse problema uma segunda vez, algumas horas depois, e o mais estranho é que aconteceu exatamente no mesmo arquivo testfile03373
, embora desta vez tenha um inode diferente, 213352984, para os arquivos duplicados. Também acrescentarei que o arquivo está sendo criado na máquina Centos 5 em que o disco está sendo hospedado e, portanto, está sendo criado localmente e mostrando a correção localmente, mas todas as outras máquinas montadas pelo NFS estão vendo a entrada duplicada.
Atualização 2: montei a unidade em uma máquina Centos v6 e encontrei o seguinte /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 novamente faz com que reapareça duas vezes ou, alternativamente, apenas tocar em um novo arquivo com o nome testfile03373
faz com que uma entrada dupla apareça, mas isso só acontece no diretório dois diretórios em que essa entrada dupla foi vista.