Файлы картинок при потере и "восстановлении" не выгружаются. Только теги Картинка.
Ситуация наблюдается не постоянно. Т.е. при обмене она может возникнуть, а может и нет. Затрагивает с десяток произвольных товаров. Отловить причину сложно. Если бы терялись все картинки или терялись бы по части, но всегда, давно бы разобрался.
Со стороны если наблюдать, то после завершения обмена картинка анонса и детальная картинка теряются. Потом, через некоторое время восстанавливаются. Я привязываю факт восстановления к обмену, но не уверен в этом. От обмена акт восстановления может не зависеть (просто протоколов навешал именно на обмен).
При отладке выясняется следующее.
Если файла картинки нет, то Битрикс ищет картинку среди уже привязанных к элементу по EXTERNAL_ID. Эти внешние коды вычисляются элементарно (md5 по содержимому тега Картинка). Факт поиск картинки по внешнему коду и список привязанных к элементу картинок я вижу. Я также вижу, что картинка находится (да, для отладки я влез в CheckFileByName).
Это значит, что она должна быть пересоздана (с получением нового ИД в таблице b_file).
И да, она пересоздается. Но с задержкой в несколько секунд от момента поиска. А привязка файла картинки к элементу инфоблока происходит с чудовищной задержкой в 50 минут. Естественно, со стороны кажется, что картинка пропала, а потом появилась ниоткуда.
Что я уже проверил
Битрикс виновен только в том, что в коде обмена (проверил исходники вплоть до версии iblock 16.5.2 не используют транзакции). Судя по логу (описал выше) картинки находятся, пересоздаются, привязываются.
Задержку пытаюсь объяснить поведением MySQL 5.1.73 на CentOS 6.8 (не MariaDB). Таблицы InnoDB (файлы и элементы инфоблока).
Ошибок в логе MySQL нет. В логе медленных запросов update на привязку файла к элементу не найден (искать легко - по ИД файла). Тестирование конфигурации Битрикс пройдено без единой ошибки (предупреждений тоже нет). Монитор производительности СУБД жалуется только на кеш открытых таблиц (12.81% при table_open_cache = 8192; статистика за 22 дня). Статуса 500 на скрипте обмена в момент «потери» и «самовосстановления» картинок не было (да и вообще они крайне редки - это Premature end of script header; в описанной ситуации между потерей и восстановлением этой болячки не было).