Remoção atômica do diretório

3

Como rename(2) é chamado por mv , é seguro assumir que o seguinte seria atômico?

$ mv /home/me/someDir /tmp/toBeDeleted
$ rm -rf /tmp/toBeDeleted
    
por jibsales 07.01.2015 / 17:52

3 respostas

2

Se os diretórios estão na mesma partição de hardware montada como um único sistema de arquivos , então mover algo é apenas renomeá-lo para um caminho diferente. No entanto, se não estiverem, cada arquivo interno precisará ser lido e copiado, portanto nenhuma parte do movimento será atômica. Como aponta Gilles, o POSIX determina que esse seja o caso para sistemas de arquivos discretos.

Exceto que, uma verificação rápida com strace confirma mv usa a chamada de sistema rename() (não confundir com rename , o utilitário de linha de comando). Isso tornaria mv ing um diretório atômico de uma perspectiva de espaço de usuário. A chamada do sistema rename() apresentará um erro EBUSY se:

oldpath or newpath is a directory that is in use by some process (perhaps as current working directory, or as root directory, or because it was open for reading) or is in use by the system (for example as mount point), while the system considers this an error. (Note that there is no requirement to return EBUSY in such cases—there is nothing wrong with doing the rename anyway—but it is allowed to return EBUSY if the system cannot otherwise handle such situations.)

De man 2 rename . A conexão com "atomicidade" aqui é que você não pode interromper outro processo trabalhando no diretório, e outro processo não pode interromper isso - ele vai acabar com um erro de caminho inválido / não encontrado se você o vencer a perseguição.

    
por 07.01.2015 / 18:16
3

O mv command chama os rename chamada do sistema , que é garantia de ser atômica. No entanto, existem duas exceções:

  • Se a origem e o destino estiverem em sistemas de arquivos diferentes, o que é relativamente comum para /home vs. /tmp , então rename falhará e mv funcionará copiando a árvore de origem para o destino e depois removendo a árvore de origem. Isto evidentemente não é atômico.
  • Existem sistemas de arquivos em que rename não é atômico, como certas implementações do NFS. Em qualquer sistema de arquivos local "normal", rename é atômico.
por 08.01.2015 / 02:12
1

Ambas as respostas dizem essencialmente a mesma coisa, mas apenas se concentram em um aspecto da remoção.

Se você tiver um shell cujo diretório de trabalho esteja dentro da árvore de diretórios renomeada / movida, ele continuará a ver e usar esses arquivos até que sejam realmente removidos. Por causa disso, o shell verá os arquivos em vários estados de exclusão e, consequentemente, renomear / mover (enquanto pode ser "atômico" em si) é não uma forma atômica de exclusão do ponto de vista de todos os usuários dos arquivos. Ela afeta apenas os usuários cujo shell está fora da árvore de diretórios desde o início.

O shell mantém suas próprias informações sobre o diretório em que se encontra. Isso porque, em algumas configurações, você pode alterar o diretório atual para um diretório no qual não possui permissões para ler as informações de diretório necessárias para determinar o caminho real, por exemplo , seguindo um link simbólico em um diretório protegido.

POSIX é vago sobre o motivo do comportamento, mas aponta o comportamento para pwd (integrado no shell) e cd (integrado no shell).

    
por 28.05.2016 / 14:14