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> HEADdentro 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.