管理员用户在 GitUtils.has_commit? 中总是遇到 500 超时,而普通用户工作正常

大家好,

我在一个全新的 Discourse 安装中遇到了一个奇怪的问题,非常希望能得到一些指导。

环境

  • Discourse Docker(最新稳定版)
  • Ubuntu 24.04
  • 使用 discourse_docker 进行全新安装
  • 除 OpenID Connect 外没有其他插件
  • Git 仓库是干净的
  • 使用 nginx 反向代理
  • 仅 HTTP(尚未启用 HTTPS)
  • 本地 Git 仓库存在且位于 latest 分支

奇怪的现象

匿名用户:

  • :white_check_mark: 主页正常加载

普通已认证用户:

  • :white_check_mark: 工作正常

通过 OpenID Connect 认证的用户:

  • :white_check_mark: 工作正常

所有本地 Discourse 管理员用户都会超时,并最终显示:


Oops

驱动此讨论论坛的软件遇到了意外问题。

或者有时显示:


服务器当前负载过高。

我们进行的测试

我们创建了一个全新的本地管理员用户,使用


rake admin:create

结果:

  • 用户作为管理员 → :cross_mark: 500 超时
  • 同一用户在修改后

u.admin = false
u.save!

:white_check_mark: 立即恢复正常

因此,该问题仅在 admin == true 时可复现。

日志

工作进程总是在大约 30 秒后超时。

回溯:


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

超时总是发生在以下位置:


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

重要观察

在容器内手动运行 Git 是瞬间完成的。

例如:


git rev-parse HEAD

返回结果仅需约 7 毫秒

此外:


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

也是立即返回的。

因此,Git 本身并不慢。

Redis

new_features 似乎不存在:


redis-cli exists new_features latest_new_feature_created_at

(integer) 0

问题

为什么 GitUtils.has_commit? 仅对管理员用户造成阻塞,而从命令行执行的所有 Git 命令都瞬间完成?

在近期的 Discourse 版本中,是否有已知的 DiscourseUpdatesnew_features 导致仅管理员超时的 bug?

任何关于下一步调查方向的建议都将不胜感激。

谢谢!