Admin-Benutzer erhalten bei GitUtils.has_commit? immer einen 500-Timeout, während normale Benutzer problemlos funktionieren

Hallo zusammen,

Ich habe ein seltsames Problem mit einer frischen Discourse-Installation und wäre für jede Hilfe dankbar.

Umgebung

  • Discourse Docker (neueste stabile Version)
  • Ubuntu 24.04
  • Frische Installation mit discourse_docker
  • Keine Plugins außer OpenID Connect
  • Git-Repository ist sauber
  • Reverse-Proxy mit nginx
  • Nur HTTP (noch kein HTTPS)
  • Lokales Git-Repository existiert und ist auf dem latest-Branch

Das seltsame Verhalten

Anonyme Benutzer:

  • :white_check_mark: Startseite lädt normal

Normale authentifizierte Benutzer:

  • :white_check_mark: Funktionieren normal

Benutzer, die über OpenID Connect authentifiziert sind:

  • :white_check_mark: Funktionieren normal

Aber jeder lokale Discourse-Admin-Benutzer erhält einen Timeout und schließlich:


Oops

Die Software, die dieses Diskussionsforum antreibt, ist auf ein unerwartetes Problem gestoßen.

oder manchmal


Der Server hat derzeit eine hohe Last.

Was wir getestet haben

Wir haben einen brandneuen lokalen Admin mit


rake admin:create

erstellt.

Ergebnis:

  • Benutzer als Admin → :cross_mark: 500 Timeout
  • derselbe Benutzer nach Änderung von

u.admin = false
u.save!

:white_check_mark: funktioniert sofort

Das Problem ist also nur dann reproduzierbar, wenn admin == true ist.

Protokoll

Der Worker läuft immer nach etwa 30 Sekunden in einen Timeout.

Rückverfolgung:


GitUtils.try_git
GitUtils.has_commit?
DiscourseUpdates.new_features
DiscourseUpdates.has_unseen_features?
CurrentUserSerializer
ApplicationLayoutPreloader

Der Timeout tritt immer hier auf:


/var/www/discourse/lib/git_utils.rb:33
Kernel#`

Wichtige Beobachtung

Das manuelle Ausführen von Git innerhalb des Containers ist blitzschnell.

Zum Beispiel:


git rev-parse HEAD

liefert in etwa 7 ms ein Ergebnis.

Außerdem:


git merge-base --is-ancestor <current_commit> HEAD

liefert sofort ein Ergebnis.

Git selbst ist also nicht langsam.

Redis

new_features scheint nicht zu existieren:


redis-cli exists new_features latest_new_feature_created_at

(integer) 0

Frage

Warum würde GitUtils.has_commit? nur für Admin-Benutzer blockieren, während jeder Git-Befehl von der Shell aus sofort ausgeführt wird?

Gibt es ein bekanntes Problem in den neuesten Discourse-Versionen, bei dem DiscourseUpdates oder new_features zu Timeouts nur für Admins führt?

Jede Idee, wo ich als Nächstes untersuchen sollte, wäre sehr willkommen.

Danke!