Nous avons rencontré le même problème et l’avons investigué plus en détail.
La cause racine est que DiscourseUpdates.has_unseen_features? appelle GitUtils.has_commit?, qui exécute :
git merge-base --is-ancestor <sha> HEAD
Dans les images Docker Discourse plus récentes, le dépôt à l’intérieur du conteneur est configuré comme un clone partiel avec un remote promisor. Lorsque le SHA de la fonctionnalité n’est pas présent localement, Git tente un fetch différé depuis le remote (upload-pack), ce qui prend environ 3 à 4 secondes par appel.
Comme plusieurs fonctionnalités sont vérifiées, cela se traduit par un temps de requête de plus de 30 secondes et finit par provoquer une erreur 502 (dépassement de délai Unicorn), en particulier pour les utilisateurs du personnel, pour qui cette vérification est effectuée.
Points clés :
-
Se produit uniquement pour le personnel (via
CurrentUserSerializer) -
Causé par l’absence de commits dans le clone partiel
-
Les opérations Git sur des objets manquants déclenchent des recherches distantes lentes
-
Reproductible via
git merge-base --is-ancestor <missing_sha> HEADà l’intérieur du conteneur
Une mesure d’atténuation simple consiste à mettre en cache les résultats de GitUtils.has_commit? (par exemple, par combinaison HEAD+SHA), ce qui évite d’appeler à plusieurs reprises Git de manière coûteuse.