Implementação do cliente/servidor

Relatar um problema Conferir código-fonte Por noite · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

O sistema Bazel é implementado como um processo de servidor de longa duração. Isso permite realizar muitas otimizações que não são possíveis com uma implementação orientada por lote, como armazenamento em cache de arquivos BUILD, gráficos de dependência e outros metadados de um criar para o próximo. Isso melhora a velocidade de builds incrementais e permite comandos diferentes, como build e query, para compartilhar o mesmo cache de os pacotes carregados, tornando as consultas muito rápidas. Cada servidor pode lidar com no máximo um de uma invocação por vez. outras invocações simultâneas bloquearão ou fail-fast (consulte --block_for_lock).

Ao executar bazel, você executa o cliente. O cliente encontra o servidor com base na base de saída, que, por padrão, é determinado pelo caminho do diretório base do espaço de trabalho e seu ID de usuário, que você criar em vários espaços de trabalho, terá várias bases de saída e, portanto, vários processos de servidor do Bazel. Vários usuários na mesma estação de trabalho podem criar simultaneamente no mesmo espaço de trabalho porque as bases de saída serão diferentes (IDs de usuário diferentes).

Se o cliente não encontrar uma instância do servidor em execução, uma nova será iniciada. Ela faz isso verificando se a base de saída já existe, o que implica o blaze arquivo já foi descompactado. Caso contrário, se a base de saída não existir, o cliente descompacta os arquivos e define o mtime para a data de nove anos no futuro. Após a instalação, o cliente confirma que os mtimes do arquivos descompactados são iguais à data distante para garantir que não haja adulteração da instalação ocorreu.

O processo do servidor será interrompido após um período de inatividade (por padrão, três horas que pode ser modificado usando a opção de inicialização --max_idle_secs). Para a maioria de que há um servidor em execução é invisível para o usuário, mas mas, às vezes, é bom ter isso em mente. Por exemplo, se você executa scripts que executam muitos builds automatizados em diretórios diferentes, é importante para evitar o acúmulo de muitos servidores inativos, é possível fazer isso desativá-los explicitamente quando terminar de usá-los ou especificando um curto período de tempo limite.

O nome de um processo do servidor do Bazel aparece na saída de ps x ou ps -e f. como bazel(dirname), em que dirname é o nome-base do que contém a raiz do diretório do espaço de trabalho. Exemplo:

ps -e f
16143 ?        Sl     3:00 bazel(src-johndoe2) -server -Djava.library.path=...

Isso torna mais fácil descobrir qual processo do servidor pertence a um espaço de trabalho. Esteja ciente de que, com algumas outras opções para ps, servidor Bazel processos podem ter o nome apenas java. Os servidores do Bazel podem ser interrompidos usando a shutdown.

Ao executar bazel, o cliente primeiro verifica se o servidor é o versão Caso contrário, o servidor será parado e um novo será iniciado. Isso garante que o uso de um processo de servidor de longa duração não interfira no funcionamento adequado o controle de versões.