rename () na atomicidade do NFS

4

Eu tenho um processo que:

  • escreve um novo arquivo '.tmp'.
  • usa rename() syscall para substituir um arquivo existente.
  • Este arquivo está sendo acessado de um cliente NFS remoto.

Fazemos isso porque queremos atualizações de arquivos atômicos e o rename() spec diz:

If newpath already exists, it will be atomically replaced, so that there is no point at which another process attempting to access newpath will find it missing. However, there will probably be a window in which both oldpath and newpath refer to the file being renamed.

Contamos com esse comportamento.

Mas aqui está a pegadinha - recentemente, desde a migração para um novo NetApp (modo Cluster, do modo 7) - tivemos um processo que ocasionalmente cai com ENOENT - nenhum arquivo ou diretório.

Por "muito ocasionalmente" quero dizer - 4 ou 5 vezes nas últimas semanas, em um processo que acontece a cada 5 minutos ou mais.

Estou investigando com o fornecedor se isso pode ser um bug ou não no servidor NFS.

Mas o que estou realmente tentando descobrir é se essa garantia de atomicidade é realmente aplicável ao NFS. Alguém pode me esclarecer se a garantia de% de rename() se aplica a cenários NFS de vários clientes? Eu não estou realmente certo de que esse recurso é um que está funcionando, mas nunca foi garantido para em primeiro lugar.

De: RFC1813

Procedure RENAME renames the file identified by from.name in the directory, from.dir, to to.name in the directory, to.dir. The operation is required to be atomic to the client.

Caso seja relevante, temos clientes SL 6.5 acessando datastores NFS no ONTAP-CDOT 8.3.

    
por Sobrique 30.11.2016 / 13:29

1 resposta

1

Evitando condições de corrida no NFS

Esse é sempre um desafio divertido e a única solução que conheço sem reescrever aplicativos é montar o compartilhamento com as opções sync e alterar o servidor NFS para usar no_wdelay . Não me lembro como definir no_wdelay na NetApp.

A desvantagem desse método é que, se você tiver muitas gravações simultâneas nesse compartilhamento, elas ficarão exponencialmente mais lentas. Você pode perguntar à NetApp como definir no_wdelay esse compartilhamento ou apenas descrever o problema para eles. Eles podem ter ideias melhores. Eu não toquei em uma NetApp em pelo menos 8 anos.

    
por 30.11.2016 / 15:04