Abbiamo riscontrato lo stesso problema e ne abbiamo rintracciato la causa più a fondo.
La causa principale è che DiscourseUpdates.has_unseen_features? chiama GitUtils.has_commit?, che esegue:
git merge-base --is-ancestor <sha> HEAD
Nei più recenti immagini Docker di Discourse, il repository all’interno del container è configurato come una partial clone con remote promisor. Quando l’SHA della funzionalità non è presente localmente, Git tenta un lazy fetch dal remote (upload-pack), che richiede circa 3–4 secondi per chiamata.
Poiché vengono controllate più funzionalità, ciò comporta un tempo di richiesta superiore a 30 secondi e, alla fine, un errore 502 (timeout di Unicorn), specialmente per gli utenti staff per i quali viene eseguita questa verifica.
Punti chiave:
-
Si verifica solo per gli utenti staff (tramite
CurrentUserSerializer) -
Causato da commit mancanti nella partial clone
-
Le operazioni Git su oggetti mancanti attivano ricerche remote lente
-
Riproducibile tramite
git merge-base --is-ancestor <missing_sha> HEADall’interno del container
Una semplice mitigazione consiste nella memorizzazione nella cache dei risultati di GitUtils.has_commit? (ad esempio, per HEAD+SHA), evitando così chiamate Git costose e ripetute.