Acesso simultâneo Mercurial

3

Temos um repositório do Mercurial (o ramo estável) em uma unidade de rede mapeada (Windows).

Eu quero saber o que acontece se mais de um usuário tentar empurrar ao mesmo tempo. Ou se alguém puxa enquanto outro está na metade de um empurrão.

O cliente Mercurial é notificado pelo sistema operacional de que o arquivo está em uso por outro processo e é suportado? Existe o risco de eu poder corromper o repositório com essa configuração?

    
por mizipzor 27.04.2010 / 10:26

2 respostas

1

O Mercurial usa arquivos de bloqueio para proteger o repositório de alterações simultâneas. Apenas um usuário pode pegar o bloqueio e alterar o repositório por vez, os outros usuários recebem uma mensagem "aguardando bloqueio no repositório".

O suporte a SMB é bloqueado, portanto, não deve haver nenhum problema (TM).

    
por 27.04.2010 / 11:01
4

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.

    
por 23.12.2011 / 00:09