ログイン後のユーザー固有の502エラー — DiscourseUpdates.has_unseen_features? に起因

同じ問題が発生し、さらに追跡しました。

根本原因は、DiscourseUpdates.has_unseen_features?GitUtils.has_commit? を呼び出しており、これが以下を実行している点です。

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

新しい Discourse Docker イメージでは、コンテナ内のリポジトリがプロミサリモートによる部分クローンとして構成されています。機能の SHA がローカルに存在しない場合、Git はリモートから遅延フェッチ(upload-pack)を試行し、呼び出しごとに約 3〜4 秒を要します。

複数の機能がチェックされるため、リクエスト時間が 30 秒以上になり、最終的には 502 エラー(Unicorn タイムアウト)が発生します。特に、このチェックが実行されるスタッフユーザーで顕著です。

主なポイント:

  • スタッフユーザーでのみ発生(CurrentUserSerializer を介して)

  • 部分クローンにおけるコミットの欠落が原因

  • 欠落オブジェクトに対する Git 操作により、低速なリモート検索がトリガーされる

  • コンテナ内で git merge-base --is-ancestor <missing_sha> HEAD を実行することで再現可能

簡単な緩和策として、GitUtils.has_commit? の結果をキャッシュすること(例:HEAD+SHA ごと)があり、これにより高コストな Git 呼び出しの繰り返しを防ぐことができます。