O Mercurial foi projetado para lidar com acesso simultâneo. Você pode ter
- uma única operação
hg push
(uma operação de gravação) e
- várias operações
hg pull
e hg clone
(operações de leitura)
simultaneamente. Em outras palavras, os leitores não precisam esperar um ao outro e também não precisam esperar por um único escritor. Os escritores têm que esperar por outros escritores.
Como os pehrs notam, isso é feito com os bloqueios . No entanto, ele não é <> feito bloqueando os arquivos com bloqueios de sistema de arquivos. Em vez disso, um arquivo de bloqueio é criado.
O arquivo de bloqueio é um link simbólico em sistemas que o suportam e um arquivo normal em outros sistemas. O arquivo ou link simbólico contém o nome do host e o identificador do processo (PID) do processo que adquiriu o bloqueio. Isso é usado para detectar bloqueios antigos: se o processo que adquiriu o bloqueio não estiver mais ativo, poderemos quebrar a fechadura com segurança.
O acima assegura que apenas um processo grava dados em um determinado repositório por vez. No entanto, existem mais perigos ao usar sistemas de arquivos de rede. Um problema em potencial é que
$ hg clone foo bar
cria links físicos entre foo
e bar
. Isso é feito para economizar espaço e acelerar bastante a operação do clone. Se um novo commit for feito em bar
, o Mercurial quebrará cuidadosamente os hard links antes de gravar novos dados nos arquivos. Basicamente faz
$ cp abc abc.tmp
$ rm abc
$ mv abc.tmp abc
para garantir que um arquivo abc
não seja compartilhado com mais ninguém. Isso só é feito se a contagem de links para abc
for maior que 1. Se a contagem de links for 1, então seria um grande desperdício copiar primeiro o arquivo. Agora, o problema é que alguns sistemas de arquivos de rede mentiram sobre a contagem de links para o Mercurial! Eles relataram 1 quando deveriam reportar 2 ou mais e isso enganou a Mercurial a não quebrar links pesados. O Mercurial 1.6.3 tem um bugfix para este caso - o Mercurial irá agora quebrar os hard links incondicionalmente ao gravar em uma unidade de rede.
Portanto, certifique-se de usar uma versão recente do Mercurial para essa configuração.