O mv é atômico no meu fs?


Respostas:


8

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ção

Sinopse

#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 por oldseja doravante conhecido pelo nome fornecido pela string apontada por new. O arquivo nomeado oldnão está mais acessível por esse nome. Se um arquivo nomeado pela string apontada por newexistir antes da chamada para a renamefunçã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 acessar newpatho encontre ausente. No entanto, provavelmente haverá uma janela na qual ambos oldpathe se newpathreferem 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.


Eu tenho que garantir que o movimento seja atômico. O teste é suficiente para aceitar isso? Não sei dizer. Sim, estou trabalhando no mesmo fs (ext4 a ext4).
Tizianoreica 9/11/16

1
O POSIX também não garante atomicidade, mas o Linux, como a maioria das variantes unix, garante sistemas de arquivos "nativos", como o ext4.
Gilles 'SO- stop be evil'

1
Dado que a ISO C define apenas o comportamento de um programa e não de um sistema inteiro, seria estranho dizer algo sobre renameatomicidade.
Gilles 'SO- stop be evil'

3
Eu li "essa especificação" como referindo-se à frase anterior ("Sua inclusão aqui ... especifica o comportamento quando o novo parâmetro nomeia um arquivo que já existe"), que se refere a partes anteriores do documento POSIX ("um link chamado new will permaneça visível para outros threads em todo ... e consulte o arquivo referido por novo ou antigo ... "). Em outras palavras, o POSIX promete implementar o padrão ISO C e oferece garantias adicionais além do que o ISO C fornece. Essa interpretação ajuda?
Simonj

1
@Tizianoreica Eu sei que este é um post antigo, mas acabei de ver seu comentário e pensei em esclarecer: O sistema de arquivos real precisa ser o mesmo para que a renomeação seja atômica. Não é apenas o mesmo tipo de sistema de arquivos. por exemplo, se você possui /um ext4 fs e /tmpum ext4 fs diferente, não é possível mv atomicamente de um para o outro.
Wodin

0

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?


fs é ext4 - os já especificado.
Tizianoreica 9/11/16

-1

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.