Специфичные для пользователя ошибки 502 после входа — связаны с DiscourseUpdates.has_unseen_features?

Мы столкнулись с той же проблемой и проследовали дальше в её поисках.

Коренная причина заключается в том, что DiscourseUpdates.has_unseen_features? вызывает GitUtils.has_commit?, который выполняет:

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

В более новых образах Docker для Discourse репозиторий внутри контейнера настроен как частичный клон с промисорным удалённым репозиторием. Если 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.