← Verbal Voyager · разборы

Календарь и баг, который живёт три дня в месяц

От зависаний на больших объёмах до ошибки, которая воспроизводится только 29–31 числа.

коммиты: a05ded8e1ced648a064c7

Объём

Календарь загружал все занятия разом, и с ростом базы страница перестала отвечать. Перевёл на помесячную подгрузку с кэшем в Redis: открывается текущий месяц, остальные догружаются по запросу.

«Февраля нет»

29 января календарь на февраль оказался пустым. new Date() брал сегодняшнее 29-е число, и установка месяца превращала несуществующее 29 февраля в 1 марта. Исправление в одну строку, но баг появляется только в последние дни длинных месяцев, поэтому его долго не ловили.

// было: сегодня 29.01 → «29.02» → 01.03
- date.setMonth(monthIndex);
+ date.setDate(1);
+ date.setMonth(monthIndex);

Сдвиг сетки

Месяцы в JavaScript считаются с нуля, в интерфейсе с единицы. В одном месте индекс не пересчитывался, и сетка строилась под предыдущий месяц.

Кэш

При просмотре чужих календарей кэш отдавал данные другого месяца. Разобрал ключи и инвалидацию: версия в ключе для общего сброса, точечная очистка при изменениях.

Следующий разборВесь прод на одном сервере