Replit: двухчасовой простой из-за утечки read-lock в Go

18 мая платформа Replit пережила простой около двух часов: с 11:45 до 13:56 по тихоокеанскому времени пользователи не могли зайти в свои Repl через сайт. Команда устранила причину, система работает штатно. В блоге опубликован постмортем с техническими деталями.
Корень проблемы — латентный баг, занесённый ещё в 2021 году при миграции конфигурации на VM. При проверке обновления типа конфигурации код брал read-lock на Golang RwMutex, но если для этого типа не было handler'а, лок на чтение не освобождался. RwMutex в Go — write-preferring: несколько read-lock'ов допустимы, пока никто не пытается взять write-lock; как только появляется попытка записи, новые read-lock'и блокируются.
16 мая 2023 года добавили новый тип конфигурации без соответствующего handler'а. С этого момента read-lock'и начали «течь», но система ещё как-то работала — до момента, когда накопилось достаточно блокировок и всё встало. Урок для всех, кто пишет на Go: неосвобождённые lock'и в долгоживущих сервисах могут выстрелить спустя годы.
Источник: May 18 Replit downtime