Implementação do cliente/servidor

Informar um problema Ver código-fonte Nightly · 7.4 . 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 que ele realize 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 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 falham 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 de base e pelo ID do usuário. Portanto, se você criar 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 são diferentes (usuários diferentes).

Se o cliente não encontrar uma instância do servidor em execução, ele vai iniciar uma nova. Para fazer isso, ele verifica 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 descompacta os arquivos do arquivo e define 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 mais distante para garantir que não tenha ocorrido nenhuma 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 dos casos, o fato de haver um servidor em execução é invisível para o usuário, mas às vezes é útil lembrar disso. Por exemplo, se você estiver executando scripts que executam muitos builds automatizados em diretórios diferentes, é importante garantir que não acumule muitos servidores inativos. Para fazer isso, encerre-os explicitamente quando terminar de usá-los ou especifique um tempo limite curto.

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. Exemplo:

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

Isso facilita a descoberta de qual processo do 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 adequada. 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ão adequado.