Como posso verificar se mvé atômico no meu fs (ext4)?
O sistema operacional é o Red Hat Enterprise Linux Server versão 6.8.
Em geral, como posso verificar isso? Eu olhei em volta e não encontrei se meu sistema operacional é POSIX padrão.
Como posso verificar se mvé atômico no meu fs (ext4)?
O sistema operacional é o Red Hat Enterprise Linux Server versão 6.8.
Em geral, como posso verificar isso? Eu olhei em volta e não encontrei se meu sistema operacional é POSIX padrão.
Respostas:
Curiosamente, parece que a resposta pode ser: "Depende".
Para ficar claro, mvé especificado para
A
mvconcessionária deve executar ações equivalentes àrename()função
A especificação da função renomear indica:
Esta
rename()função é equivalente para arquivos regulares àquela definida pelo padrão ISO C. Sua inclusão aqui expande essa definição para incluir ações em diretórios e especifica o comportamento quando o novo parâmetro nomeia um arquivo que já existe. Essa especificação requer que a ação da função seja atômica.
Mas a mais recente especificação ISO C para rename()estados:
7.21.4.2 A
renamefunçãoSinopse
#include <stdio.h> int rename(const char *old, const char *new);Descrição
A
renamefunção faz com que o arquivo cujo nome é a string apontada poroldseja doravante conhecido pelo nome fornecido pela string apontada pornew. O arquivo nomeadooldnão está mais acessível por esse nome. Se um arquivo nomeado pela string apontada pornewexistir antes da chamada para arenamefunção, o comportamento será definido pela implementação.Devoluções
A
renamefunção retornará zero se a operação for bem-sucedida, diferente de zero se falhar; nesse caso, se o arquivo existia anteriormente, ainda é conhecido por seu nome original.
Surpreendentemente, observe que não há requisitos explícitos para atomicidade. Pode ser necessário em outro lugar do último padrão C disponível publicamente, mas não consegui encontrá-lo. Se alguém puder encontrar esse requisito, edições e comentários serão bem-vindos.
Consulte também É renomeado () atômico?
De acordo com a página de manual do Linux :
Se
newpathjá existir, ele será substituído atomicamente, de modo que não há nenhum ponto em que outro processo que tente acessarnewpatho encontre ausente. No entanto, provavelmente haverá uma janela na qual ambosoldpathe senewpathreferem ao arquivo que está sendo renomeado.
A página de manual do Linux afirma que a substituição do arquivo será atômica.
Testar e verificar se a atomicidade pode ser muito difícil, se é assim que você precisa ir. Você não está claro quanto ao significado de "Como posso verificar se mv é atômico". Deseja requisitos / especificação / documentação atômica ou precisa realmente testá- lo?
Observe também que o acima pressupõe que os dois nomes de arquivos de operando estejam no mesmo sistema de arquivos. Não consigo encontrar nenhuma restrição padrão no mvutilitário para impor isso.
renameatomicidade.
/um ext4 fs e /tmpum ext4 fs diferente, não é possível mv atomicamente de um para o outro.
mvé baseado na renamechamada do sistema e rename()é atômico. Você pode olhar para a página de manual rename(2).
Você pode encontrar resposta em É renomear () atômico? no stackoverflow.
Que tipo de fs você usou?
Além de verificar as chamadas do sistema e sua atomicidade, talvez inotify-toolspossa servir como teste, embora não tenha certeza se é uma prova garantida de atomicidade.
Abra 2 conchas. Assista ao diretório de destino da movimentação em um deles:
inotifywait -m target/
Mova um arquivo para o diretório no outro:
mv foobar target/
O inotifywaitdeve mostrar apenas uma linha:
target/ MOVED_TO foobar
Parece atômica em comparação com a resposta a ls target/e touch target/a, que produzem mensagens de várias linhas como:
# the response to ls target/
target/ OPEN,ISDIR
target/ ACCESS,ISDIR
target/ CLOSE_NOWRITE,CLOSE,ISDIR
PS
Eu acho que, pelo menos, mostra que a cooperação multiprocesso assíncrona em arquivos é segura com inotify(praticamente atômica): em qualquer caso, você responderia apenas depois de inotifydar o sinal final após a operação. Por exemplo, uma configuração produtor-consumidor pode ser implementada com facilidade e segurança inotify.
strace?