Wir sind auf das gleiche Problem gestoßen und haben es weiter zurückverfolgt.
Die Ursache liegt darin, dass DiscourseUpdates.has_unseen_features? GitUtils.has_commit? aufruft, was folgenden Befehl ausführt:
git merge-base --is-ancestor <sha> HEAD
In neueren Discourse-Docker-Images ist das Repository im Container als partieller Clone mit einem promisorischen Remote konfiguriert. Wenn die SHA des Features nicht lokal vorhanden ist, versucht Git einen Lazy-Fetch vom Remote (upload-pack), was pro Aufruf etwa 3–4 Sekunden dauert.
Da mehrere Features geprüft werden, führt dies zu einer Anfragezeit von über 30 Sekunden und schließlich zu einem 502-Fehler (Unicorn-Timeout), insbesondere bei Benutzerkonten mit Staff-Rechten, bei denen diese Prüfung ausgeführt wird.
Wichtige Punkte:
-
Tritt nur bei Staff-Benutzern auf (über
CurrentUserSerializer) -
Verursacht durch fehlende Commits im partiellen Clone
-
Git-Operationen bei fehlenden Objekten lösen langsame Remote-Abfragen aus
-
Reproduzierbar über
git merge-base --is-ancestor <missing_sha> HEADim Container
Eine einfache Abhilfemaßnahme besteht darin, die Ergebnisse von GitUtils.has_commit? zu cachen (z. B. pro HEAD+SHA), wodurch wiederholte, aufwendige Git-Aufrufe vermieden werden.