Мы столкнулись с той же проблемой и проследовали дальше в её поисках.
Коренная причина заключается в том, что 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.