Benutzerspezifische 502-Fehler nach dem Login – zurückgeführt auf DiscourseUpdates.has_unseen_features?

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> HEAD im 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.