Errores 502 específicos del usuario después del inicio de sesión, ¿trazados a DiscourseUpdates.has_unseen_features?

Encontramos el mismo problema y lo rastreamos más a fondo.

La causa raíz es que DiscourseUpdates.has_unseen_features? llama a GitUtils.has_commit?, el cual ejecuta:

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

En las imágenes de Docker de Discourse más recientes, el repositorio dentro del contenedor está configurado como una clonación parcial con un remoto promisorio. Cuando el SHA de la característica no está presente localmente, Git intenta una búsqueda diferida desde el remoto (upload-pack), lo que toma ~3–4 segundos por llamada.

Dado que se verifican varias características, esto resulta en un tiempo de solicitud de más de 30 segundos y, finalmente, en un error 502 (timeout de Unicorn), especialmente para usuarios del personal, ya que esta verificación se ejecuta en su caso.

Puntos clave:

  • Ocurre solo para el personal (a través de CurrentUserSerializer)

  • Causado por commits faltantes en la clonación parcial

  • Las operaciones de Git en objetos faltantes desencadenan búsquedas remotas lentas

  • Reproducible mediante git merge-base --is-ancestor <sha_faltante> HEAD dentro del contenedor

Una mitigación sencilla es cachear los resultados de GitUtils.has_commit? (por ejemplo, por HEAD+SHA), lo que evita llamadas repetidas y costosas a Git.