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-загрузок после достижения лимита».

Изображение к статье: GIF из «Друзей» раздул бэкап Discourse до 377 ГБ и упёрся в лимиты ext4

Это уже не косметика, а реальная нагрузка на хранилище и время бэкапа.

Дубликаты раздувают бэкапы в разы

В другом случае у клиента Discourse объём uploads достигал 432 ГБ. Анализ показал, что уникального контента там всего 26 ГБ. Остальное — дубли, то есть инфляция примерно в 16 раз.

Для админов это бьёт сразу по двум местам: по квотам на бэкапы и по надёжности. Когда бэкап упирается в лимиты файловой системы, он может не просто «раздуться», а ещё и начать падать.

Вторая версия фикса: hardlink до лимита, потом новый «primary»

В итоге Discourse доработал подход. Новый алгоритм тоже начинает с hardlink, но следит за ошибкой EMLINK (слишком много hardlink). Когда файловая система возвращает EMLINK, Discourse копирует файл локально и назначает новую копию «primary». Дальше дубли линкуются уже к ней, пока лимит снова не закончится.

Discourse подчёркивает, что этот механизм «работает на любой файловой системе и не требует настройки». В финале разбор заканчивается иронией: «теперь я знаю, что Дженнифер Энистон может стресс-тестировать инфраструктуру».

Продолжение после рекламы

Вирусный твит про этот случай датирован 9 апреля 2026 и как раз фиксирует цифры: 1,6 МБ превратились в 377 ГБ из-за 246 173 копий.

Рейтинг: 0 / 5. Оценок: 0

Рекомендуем почитать

Оставьте комментарий

Перед оставлением комментария, пожалуйста, ознакомьтесь с правилами комментирования.