Gli utenti admin ricevono sempre un timeout 500 in GitUtils.has_commit?, mentre gli utenti normali funzionano correttamente

Ciao a tutti,

Sto riscontrando un problema strano con una nuova installazione di Discourse e apprezzerei qualsiasi suggerimento.

Ambiente

  • Discourse Docker (ultima versione stabile)
  • Ubuntu 24.04
  • Installazione pulita usando discourse_docker
  • Nessun plugin tranne OpenID Connect
  • Repository Git pulito
  • Reverse proxy con nginx
  • Solo HTTP (ancora nessun HTTPS)
  • Repository Git locale esistente e sul ramo latest

Il comportamento strano

Utenti anonimi:

  • :white_check_mark: La homepage si carica normalmente

Utenti autenticati normali:

  • :white_check_mark: Funzionano normalmente

Utenti autenticati tramite OpenID Connect:

  • :white_check_mark: Funzionano normalmente

Ma ogni utente admin locale di Discourse riceve un timeout e alla fine:


Oops

Il software che alimenta questo forum di discussione ha incontrato un problema imprevisto.

o a volte


Il server è attualmente sottoposto a un carico elevato.

Cosa abbiamo testato

Abbiamo creato un nuovo admin locale usando


rake admin:create

Risultato:

  • utente come Admin → :cross_mark: timeout 500
  • stesso utente dopo aver modificato

u.admin = false
u.save!

:white_check_mark: funziona immediatamente

Quindi il problema è riproducibile solo quando admin == true.

Log

Il worker va sempre in timeout dopo circa 30 secondi.

Backtrace:


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

Il timeout si verifica sempre qui:


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

Osservazione importante

Eseguire Git manualmente all’interno del contenitore è istantaneo.

Ad esempio:


git rev-parse HEAD

ritorna in circa 7 ms.

Inoltre:


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

ritorna immediatamente.

Quindi Git in sé non è lento.

Redis

new_features non sembra esistere:


redis-cli exists new_features latest_new_feature_created_at

(integer) 0

Domanda

Perché GitUtils.has_commit? bloccherebbe solo per gli utenti admin mentre ogni comando Git viene eseguito istantaneamente da shell?

C’è qualche problema noto nelle versioni recenti di Discourse in cui DiscourseUpdates o new_features causa timeout solo per gli admin?

Qualsiasi idea su dove indagare ulteriormente sarebbe molto apprezzata.

Grazie!