Implementação do cliente/servidor

O sistema do Bazel é implementado como um processo de servidor de longa duração. Isso permite que ele execute 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 comandos diferentes, 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 no diretório de saída, que, por padrão, é determinado pelo caminho do diretório do espaço de trabalho base e pelo ID do usuário. Portanto, se você criar em vários espaços de trabalho, terá vários diretórios de saída e, consequentemente, 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 os diretórios 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 iniciará uma nova. Para isso, ele verifica se o diretório de saída já existe, o que implica que o arquivo do Blaze já foi descompactado. Caso contrário, se o diretório de saída não existir, o cliente descompactará os arquivos do arquivo e definirá os mtimes deles para uma data 9 anos no futuro. Depois de instalado, o cliente confirma se os mtimes dos arquivos descompactados são iguais à data distante para garantir que não tenha ocorrido 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 maioria das vezes, 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 inativos. Para isso, encerre-os explicitamente quando terminar de usá-los ou especifique um período de tempo limite curto.

O nome de um processo de servidor do 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=...

Isso facilita a descoberta de qual processo de servidor pertence a um determinado espaço de trabalho. Com algumas outras opções para ps, os processos de servidor do Bazel podem ser nomeados apenas java. Os servidores do Bazel podem ser interrompidos usando o comando de encerramento.

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