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
mv
concessioná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
rename
funçãoSinopse
#include <stdio.h> int rename(const char *old, const char *new);
Descrição
A
rename
função faz com que o arquivo cujo nome é a string apontada porold
seja doravante conhecido pelo nome fornecido pela string apontada pornew
. O arquivo nomeadoold
não está mais acessível por esse nome. Se um arquivo nomeado pela string apontada pornew
existir antes da chamada para arename
função, o comportamento será definido pela implementação.Devoluções
A
rename
funçã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
newpath
já existir, ele será substituído atomicamente, de modo que não há nenhum ponto em que outro processo que tente acessarnewpath
o encontre ausente. No entanto, provavelmente haverá uma janela na qual ambosoldpath
e senewpath
referem 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 mv
utilitário para impor isso.
rename
atomicidade.
/
um ext4 fs e /tmp
um ext4 fs diferente, não é possível mv atomicamente de um para o outro.
mv
é baseado na rename
chamada 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-tools
possa 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 inotifywait
deve 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 inotify
dar 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
?