Erros 502 específicos do usuário após o login — rastreados até DiscourseUpdates.has_unseen_features?

Encontramos o mesmo problema e rastreamos a causa raiz.

A causa raiz é DiscourseUpdates.has_unseen_features? chamando GitUtils.has_commit?, que executa:

git merge-base --is-ancestor <sha> HEAD

Em imagens Docker do Discourse mais recentes, o repositório dentro do contêiner está configurado como um clone parcial com remoto promissor. Quando o SHA da funcionalidade não está presente localmente, o Git tenta uma busca sob demanda no remoto (upload-pack), o que leva ~3 a 4 segundos por chamada.

Como várias funcionalidades são verificadas, isso resulta em um tempo de requisição de mais de 30 segundos e, eventualmente, em um erro 502 (timeout do Unicorn), especialmente para usuários da equipe, onde essa verificação é executada.

Pontos-chave:

  • Ocorre apenas para usuários da equipe (via CurrentUserSerializer)

  • Causado por commits ausentes no clone parcial

  • Operações do Git em objetos ausentes acionam buscas remotas lentas

  • Reproduzível via git merge-base --is-ancestor <missing_sha> HEAD dentro do contêiner

Uma mitigação simples é armazenar em cache os resultados de GitUtils.has_commit? (por exemplo, por HEAD+SHA), o que evita chamadas repetidas e custosas ao Git.