Implementação do cliente/servidor

Informar um problema Ver código-fonte

O sistema Bazel é implementado como um processo de servidor de longa duração. Isso permite que ela realize muitas otimizações possíveis com uma implementação orientada a lotes, como armazenamento em cache de arquivos BUILD, gráficos de dependência e outros metadados de uma versão para a próxima. Isso aumenta 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.

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 de espaço de trabalho base e 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 do Bazel. Vários usuários na mesma estação de trabalho podem ser criados 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, ele iniciará uma nova instância. Isso 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 descompactará os arquivos e definirá os mtimes como uma data de nove anos no futuro. Uma vez instalado, o cliente confirma que 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 (três horas, por padrão, que pode ser modificado usando a opção de inicialização --max_idle_secs). Na maioria dos casos, o fato de haver um servidor em execução é invisível para o usuário, mas, às vezes, ajuda a levar isso em consideração. Por exemplo, se você estiver executando scripts que executam várias versões automatizadas em diretórios diferentes, é importante garantir que você não acumule muitos servidores inativos. Para isso, encerre-os explicitamente quando não precisar mais deles ou especifique 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 diretório que inclui a raiz do diretório do espaço de trabalho. Por 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 do servidor do Bazel podem ser nomeados apenas como java. Os servidores do Bazel podem ser interrompidos usando o comando shutdown.

Ao executar bazel, o cliente primeiro verifica se o servidor é a versão apropriada. Se não estiver, 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ão adequado.