Está extraindo a primeira linha de um arquivo que é acessado via NFS thread safe?

0

Se eu montar um diretório via NFS em vários servidores, cada um executando um processo que lê e exclui a primeira linha de um arquivo específico nesse diretório, pode de alguma forma ser garantido que nenhuma linha é lida duas vezes ou excluída sem ser extraída? / p>

Eu poderia obviamente criar algum tipo de mutex que permita apenas que um processo opere no arquivo montado pelo NFS, mas existe uma construção para conseguir isso?

    
por sge 03.12.2017 / 14:24

1 resposta

1

If I mount a directory via NFS on multiple servers each running a process that reads and deletes the first line of a specific file in that directory, can it somehow be guaranteed that no line is read twice or deleted without beeing extracted?

Você pode garantir que a linha não será excluída sem ser extraída com muita facilidade: simplesmente não faça isso. Não faça seu processamento excluir a linha a menos que já esteja "extraída", seja lá o que for.

Você pode garantir que uma linha será processada apenas uma vez? Na verdade não - existem todos os tipos de falhas de tempo no NFS. Dados e metadados são armazenados em cache em todos os clientes e, mesmo se todo o armazenamento em cache estiver desativado, haverá atrasos significativos nas transferências de dados da rede. Um processo em um servidor pode não "ver" algo acontecer até que seja tarde demais.

Mas, aparentemente, você perdeu um problema ainda maior: excluir a primeira linha de um arquivo requer a regravação de todo o resto do arquivo. Como parece que você está tentando usar este arquivo como algum tipo de FIFO, eu também suponho que você tenha outros processos acrescentando linhas ao final do arquivo. Quão bem você acha que vai funcionar quando vários clientes reescreverem o arquivo inteiro depois que cada um deles excluir a primeira linha? Mesmo se você puder obter os clientes devidamente sincronizados, você terá que adicionar qualquer processo de escrita ao seu cluster de sincronização.

E isso é basicamente o que você precisa criar - um cluster de software que compartilha um único arquivo que precisa ser totalmente bloqueado para atualizar seu conteúdo - seja para reescrever o arquivo inteiro sem sua primeira linha ou para anexar ao final de o arquivo.

Pode ser feito de forma confiável? Claro, mas não usando apenas NFS.

Se você está pensando em usar um arquivo como FIFO, provavelmente faria melhor simplesmente colocar cada linha em um arquivo separado, usando rename() para mover o arquivo de um diretório comum para um diretório específico do cliente no mesmo sistema de arquivos montado pelo NFS. Cada cliente teria seu próprio diretório, e se o rename() trabalhasse, saberia que ele tinha "reivindicado" aquele arquivo com sucesso, e se ele falhasse, assumiria que outro cliente tinha "reivindicado" o arquivo.

Esperamos que a implementação do NFS seja robusta o suficiente para lidar com rename() tentativas conflitantes corretamente no servidor NFS onde apenas um cliente trabalha e obtém um retorno bem-sucedido de rename() e todos os outros clientes falharem - sem bloquear o NFS servidor ou travar o kernel.

    
por 03.12.2017 / 14:58