O NFS pode desvincular e recriar o resultado em uma condição de corrida?

1

Estou vendo um comportamento estranho e estou pensando se é uma condição de corrida.

O comportamento estranho é o MySQL obter EEXIST ao tentar criar um arquivo temporário. O MySQL reutiliza nomes de arquivos temporários por padrão, e como escolhe nomes em ordem de um conjunto de nomes, o nome #sql_<pid>_0.<ext> é sempre escolhido primeiro se já não estiver em uso (o último 0 indica a posição do nome em a piscina).

Eu sei que o NFS simula a desconexão devido ao requisito de preservar blocos em um arquivo aberto. Quando você desvincula um arquivo em um volume NFS, o cliente renomeia o arquivo e, quando os processos no cliente o fecham, finalmente faz um link.

Mas e se eu desvincular o arquivo e, em seguida, um segundo thread tentar recriar um arquivo com o mesmo nome dentro de um milissegundo depois da desassociação?

É possível que a renomeação seja assíncrona, e pode ser atrasada o suficiente para que o segundo thread receba um erro EEXIST mesmo que meu thread acredite que tenha terminado sua chamada unlink () com sucesso?

    
por Bill Karwin 18.11.2014 / 01:16

0 respostas

Tags