Содержание
Discourse столкнулся с редким, но болезненным багом: один реакционный GIF весом 1,6 МБ в бэкапе разросся до 377 ГБ. Причина — политика «secure uploads», из-за которой один и тот же файл копировался 246 173 раза и в итоге упёрся в лимиты файловой системы ext4.
История всплыла в разборе инженера Discourse Джейка Голдсборо. В роли «виновника» выступила анимация с «happy dance» из сериала «Друзья», которую пользователи активно вставляли в чатах и обсуждениях.
Почему одинаковый GIF стал разными файлами
Проблему запустила функция Discourse secure uploads. Она нужна, чтобы разграничивать доступ к файлам в разных «контекстах» — например, в личных сообщениях и публичных постах.
Логика там простая: когда файл «переезжает» между контекстами, система создаёт новую копию и присваивает ей рандомизированный SHA1. Контент идентичен, но для Discourse это уже другой объект. Если сообщество любит один и тот же мем или реакцию, копии начинают плодиться по всей базе.
Первая попытка экономии упёрлась в лимит hardlink в ext4
Команда Discourse попробовала починить бэкапы элегантно: на этапе резервного копирования группировать загрузки по хэшу, скачивать только первый файл в группе, а для дублей создавать hardlink.
Но на крупных инсталляциях всплыл лимит ext4: примерно 65 000 hardlink на один inode. В кейсе с 246 173 дублями бэкап формально прошёл, но после достижения лимита система начала «откатываться» к обычным скачиваниям. По словам Discourse, вместо одной загрузки на все дубли получилось «одна загрузка плюс примерно 181 000 fallback-загрузок после достижения лимита».
Это уже не косметика, а реальная нагрузка на хранилище и время бэкапа.
Дубликаты раздувают бэкапы в разы
В другом случае у клиента Discourse объём uploads достигал 432 ГБ. Анализ показал, что уникального контента там всего 26 ГБ. Остальное — дубли, то есть инфляция примерно в 16 раз.
Для админов это бьёт сразу по двум местам: по квотам на бэкапы и по надёжности. Когда бэкап упирается в лимиты файловой системы, он может не просто «раздуться», а ещё и начать падать.
Вторая версия фикса: hardlink до лимита, потом новый «primary»
В итоге Discourse доработал подход. Новый алгоритм тоже начинает с hardlink, но следит за ошибкой EMLINK (слишком много hardlink). Когда файловая система возвращает EMLINK, Discourse копирует файл локально и назначает новую копию «primary». Дальше дубли линкуются уже к ней, пока лимит снова не закончится.
Discourse подчёркивает, что этот механизм «работает на любой файловой системе и не требует настройки». В финале разбор заканчивается иронией: «теперь я знаю, что Дженнифер Энистон может стресс-тестировать инфраструктуру».
Вирусный твит про этот случай датирован 9 апреля 2026 и как раз фиксирует цифры: 1,6 МБ превратились в 377 ГБ из-за 246 173 копий.