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?