Errori 502 specifici dell'utente dopo il login — ricondotti a DiscourseUpdates.has_unseen_features?

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> HEAD all’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.