O que acontece se um arquivo é modificado enquanto você o copia?

19

Qual é o efeito de copiar um arquivo, digamos fileA.big (900mb) da localização B para locationC. Se durante a operação cp, digamos 35% através do processo, fileA.big é anexado com novas informações e cresce de 900mb para 930mb.

Qual é o resultado da cópia final (por exemplo, fileA.big na localizaçãoC)?

E se a cópia tiver cerca de 70% e o arquivo original for atualizado, mas desta vez truncado para 400mb (ou seja, o progresso da cópia está além do ponto de truncamento), qual é o resultado da cópia final?

Referindo-se a um sistema operacional Linux em um sistema de arquivos ext3 / ext4. Nenhuma magia de sombra de volume, etc. Simplesmente velho cp. Curiosidade provocada por copiar arquivos couchdb ao vivo para backup, mas mais interessados em cenários gerais do que em casos de uso específicos.

    
por Mâtt Frëëman 05.02.2011 / 05:46

2 respostas

10

Se fileA.big for aumentado durante a cópia, a cópia incluirá os dados que foram anexados.

Se o arquivo estiver truncado mais curto do que o local em que a cópia está atualmente, a cópia será interrompida exatamente onde seu arquivo de destino e o arquivo de destino conterão o que foi copiado até a hora em que foi anulado.

    
por 05.02.2011 / 05:56
26

Patrick tem mais ou menos correto, mas aqui está o porquê. A maneira como você copia um arquivo no UNIX funciona assim:

  1. Tente ler alguns (mais) bytes de fileA .
  2. Se não obtivermos bytes porque estamos no (ou passado) o final do arquivo, terminamos; saia.
  3. Caso contrário, grave os bytes em fileB e retorne ao passo 1.

Sabendo disso, e sabendo que é tão simples quanto isso, vamos ver alguns casos extremos.

Assim que encontrarmos o final do arquivo, a cópia está pronta. Então, digamos que nosso arquivo está crescendo durante a cópia, mas está crescendo mais lentamente do que estamos copiando. O programa de cópia continuará passando do tamanho do arquivo original, porque quando chega lá, há mais no arquivo. Mas em algum momento, ele alcança o final do arquivo, e ele sabe que está no final porque não pode ler mais bytes agora . Então, ele sai, mesmo que o arquivo esteja prestes a crescer.

Se o arquivo estiver truncado, o programa de cópia diz "Whoa, eu passei do final do arquivo!" e sai.

E se partes do arquivo estão sendo atualizadas aleatoriamente por, digamos, um programa de banco de dados :-), então sua cópia será uma mistura de dados antigos e novos, porque os dados não são todos copiados ao mesmo tempo Tempo. O resultado provavelmente será uma cópia corrompida, e é por isso que geralmente não é uma boa ideia fazer cópias de bancos de dados ao vivo.

(Dito isto, não estou familiarizado com o CouchDB, e é possível projetar um banco de dados para resistir a esse tipo de corrupção. Mas é melhor ter certeza absoluta.)

    
por 05.02.2011 / 07:05

Tags