Есть у нас один друпальный сайтик, на котором стоят уведомления админов по имейлу, если пользователи создали или обновили материал определенного типа. Админов мало, материалы данного типа обновляются редко, и грузить пользователей тем, что «вы подождите, сейчас пройдет премодерация» — не хочется, они этого не поймут. Хочется чтобы сразу изменения появились, а админ потом проверит. Поэтому так.
На уведомления стоит одна блокировка — если материал обновляет кто-то из админов, уведомлять никого не надо. Это понятно.
А тут значит потребовалось сделать импорт новых материалов данного типа, из непростого CSV, с некоторыми сопутствующими действиями, всего ~45К материалов. Импорт выполняется командой drush
, то есть обычно не от имени админа. Добавили в код уведомлений проверочку на этот случай, неохота 45 тыщ писем получать о своих же действиях.
Запускаю импорт, он добегает до конца, я иду довольный спать. А утром, конечно, обнаруживаю пару тысяч писем в почте, блок почтового порта от бдительного хостера, и еще несколько тысяч аналогичных писем в deferred-очереди.
Ну, думаю, криво проверочку написал (хотя проверял ведь). Но самое интересное — что писем-то в очереди постфикса всего 2–3 тысячи, а вовсе не 40. И если очередь почистить, то новые письма откуда-то продолжают появляться. И поскольку я был убежден, что это мои 45К уже отправленных уведомлений, решил что это хитрый линукс, или хитрый sendmail, или хитрый php mail() где-то их закэшировал и потихоньку подтягивает. Трудно передать, как долго и как безрезультатно мне пришлось копаться в описаниях упомянутых хитрых штук, а также постфикса и его демонов. Но я копался — искал как прибить оставшиеся десятки тысяч уведомлений, которых нет в очереди, но есть уверенность, что они там будут.
А письма шли и шли. И СТП хостера то блокировала порт, то разблокировала. Что, кстати, отдельная тема для разговора — порт хостер блокирует на автомате, не разбираясь, кто ты и что отправляешь. Улетело много писем — блок. А ты потом иди и доказывай, что ты не спамер и твои письма никому кроме тебя не вредят. Ладно в этот раз я со своими случайными уведомлениями, а если бы они были важные и на деньги завязанные?
А письма шли и шли. И было совершенно непонятно, где эта пачка писем живет. Хотел уже плюнуть и переустановить сервер, избавиться от всех писем раз и навсегда. Но в последний момен зашел в admin/content
посмотреть на очередной материал из только что полученного письма с уведомлением. И увидел внезапно, что дата обновления у материала почему-то не равна дате импорта, а равна сегодняшнему дню. И, как говорится, прозрел.
Оказалось, что проверочка для импорта сработала отлично и ничего никуда не отправилось, и никакие 45К писем при импорте нигде не закэшировались. А письма генерировались старым кодом, который при первом просмотре страницы материала создавал для материала специальную сущность и сохранял на нее референс. И это засчитывалось как обновление, которое я проглядел.
И отправлялись письма по чуть-чуть, а не разом, потому что материалы были созданы программно и не получили сразу свои первые просмотры (в отличие от материалов, добавляемых вручную). И генерировал эти первые заходы — поисковый робот. На сколько страниц он успевал зайти — столько писем и отправлялось.
Такая вот фигня, об которую я чуть голову не сломал.
А мораль вот в чем: неверная предпосылка может здорово вынести мозг без всякой пользы. Так что не повредит сделать шаг назад и посмотреть на ситуацию целиком, а не только на то, что мы об этой ситуации заведомо себе придумали.