Implementação do cliente/servidor

Informar um problema Ver fonte Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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

Ao executar bazel, você está executando o cliente. O cliente encontra o servidor com base na base de saída, que, por padrão, é determinada pelo caminho do diretório do espaço de trabalho base e pelo seu ID de usuário. Portanto, se você criar em vários espaços de trabalho, terá várias bases de saída e, portanto, vários processos do servidor 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 de servidor em execução, ele vai iniciar uma nova. Ele faz isso verificando se a base de saída já existe, o que implica que o arquivo blaze já foi descompactado. Caso contrário, se a base de saída não existir, o cliente vai descompactar os arquivos do arquivo e definir os mtimes para uma data 9 anos no futuro. Depois de instalado, o cliente confirma que os mtimes dos arquivos descompactados são iguais à data distante para garantir que não houve adulteração da instalação.

O processo do servidor será interrompido após um período de inatividade (3 horas por padrão, que pode ser modificado usando a opção de inicialização --max_idle_secs). Na maior parte do tempo, o fato de haver um servidor em execução é invisível para o usuário, mas às vezes é útil ter isso em mente. Por exemplo, se você estiver executando scripts que realizam muitos builds automatizados em diretórios diferentes, é importante garantir que você não acumule muitos servidores ociosos. Para isso, desligue-os explicitamente quando terminar de usá-los ou especifique um período de tempo limite curto.

O nome de um processo do servidor Bazel aparece na saída de ps x ou ps -e f como bazel(dirname), em que dirname é o nome base do diretório que envolve 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=...

Assim, fica mais fácil descobrir a qual espaço de trabalho um determinado processo de servidor pertence. (Com outras opções para ps, os processos do servidor do Bazel podem ser chamados apenas de java.) Os servidores do Bazel podem ser interrompidos usando o comando shutdown.

Ao executar o bazel, o cliente primeiro verifica se o servidor é a versão adequada. Se não for, o servidor será interrompido e um novo será iniciado. Isso garante que o uso de um processo de servidor de longa duração não interfira no controle de versões adequado.