Родительское сообщение не существует

При импорте mbxs возникает ошибка, что родительское сообщение не существует, хотя оно, похоже, присутствует в базе данных index.db.

Вот текст ошибки:

Родительское сообщение 9205270657.AB03850@ben.dciem.dnd.ca не существует. Пропуск 9206031720.AA22567@ben.dciem.dnd.ca: A CALL FOR HELP

А вот запись в базе данных:

Annotation 2020-02-16 155700

Есть ли какие-либо предложения, почему это не работает?

Возможно, порядок сортировки неверен, потому что вы группируете письма по теме? Стоит это проверить. Сообщения сортируются только по полю Subject и порядку писем в файле mbox.

Вы действительно уверены, что вам нужно группировать письма по теме? Судя по вашему скриншоту, у писем корректно заполнены заголовки Message-ID, а также In-Reply-To и References.

Спасибо. Если посмотреть на таблицу email_order, то там всё выглядит в правильном порядке:

msg_id rowid
9205270657.AB03850@ben.dciem.dnd.ca 874
9206031720.AA22567@ben.dciem.dnd.ca 875

Может быть, что-то ещё мешает импортировать эти родительские сообщения?

Когда я делал первый импорт, казалось, что группировки вообще нет. Думаю, проблема в том, что ответы адресованы списку рассылки, а не отправителю. Кроме того, в некоторых сообщениях этих полей вообще нет, так как архив формировался вручную на протяжении 28 лет довольно хаотично, с использованием разных версий Eudora.

Возможно, не удается импортировать родительское сообщение? Произошла ошибка? Трудно сказать, почему сообщение не находится. Мне жаль, но, кажется, вам придется отладить это самостоятельно, изменив Ruby-код скрипта импорта.

Нет, я не думаю, что была ошибка.

Хорошо, хотя я не знаком с Ruby или скриптом импорта, но, возможно, смогу попробовать.

Не могли бы вы подсказать, какие скрипты нужно проверить и где они находятся? Имеет ли «отладка» в виду добавление операторов вывода или есть более продвинутый функционал?

https://github.com/discourse/discourse/tree/master/script/import_scripts/mbox

Хорошо, я добавил несколько отладочных выводов в функцию map_first_post

def map_first_post(row)
  puts "Mapping parent #{row['msg_id']} #{row['subject'][0..40]}"
  mapped = map_post(row)
  mapped[:category] = category_id_from_imported_category_id(row['category'])
  mapped[:title] = row['subject'].strip[0...255]
  mapped
  puts "Mapped message #{row['msg_id']} #{row['subject'][0..40]}"
end  

def map_reply(row)
  parent = @lookup.topic_lookup_from_imported_post_id(row['in_reply_to'])
  if parent.blank?
    puts "Parent message #{row['in_reply_to']} doesn't exist. Skipping #{row['msg_id']}: #{row['subject'][0..40]}"
    return nil
  end

  mapped = map_post(row)
  mapped[:topic_id] = parent[:topic_id]
  mapped
end

Эти выводы выглядят нормально и указывают на то, что родительское сообщение отображено (импортировано?)

873 / 65936 ( 1.3%) [3895 items/min]
Mapping parent 9205270657.AB03850@ben.dciem.dnd.ca A CALL FOR HELP
Mapped message 9205270657.AB03850@ben.dciem.dnd.ca A CALL FOR HELP
874 / 65936 ( 1.3%) [3900 items/min]
Parent message 9205270657.AB03850@ben.dciem.dnd.ca doesn’t exist. Skipping 9206031720.AA22567@ben.dciem.dnd.ca: A CALL FOR HELP

Так что не вижу причин, по которым родитель в map_reply был бы пустым. Единственное, что я заметил, это то, что номера (873/874) на единицу меньше, чем rowid выше.

Но я не думаю, что смогу продвинуться дальше, так как не знаю, что делает @lookup.topic_lookup_from_imported_post_id, а редактирование с помощью vi и повторный запуск импорта — очень трудоемкий процесс, при этом каждый цикл занимает около 30 минут.

Этот метод находится в файле base.rb в той же директории. Он делает именно то, что следует из названия функции: ищет topic_id, находя import_id (который, как я предполагаю, в данном случае является ID сообщения) в пользовательском поле темы (или, возможно, в пользовательском поле поста?).

Это лучше, чем те случаи, когда импорт занимает неделю. :wink: (Иногда можно настроить скрипт импорта так, чтобы он импортировал только то, что вы отлаживаете; как именно это сделать, оставляем читателю в качестве упражнения.)

Вы можете попробовать посмотреть в базу данных и проверить, импортируется ли родительское сообщение, и есть ли у него пользовательское поле темы/поста import_id.

Где именно ищется? Является ли topic_id темой?

Под «базой данных» вы имеете в виду index.db? Под «импортировано» вы имеете в виду запись в таблицу email файла index.db? Да, оно там есть. Но нет столбца с названием ‘import_id’.

Под базой данных я имею в виду базу данных Discourse. Идентификатор импорта находится в таблицах topic_custom_field и post_custom_field.

Ага!

Я импортировал плагин Data Explorer и изучил базу данных Discourse. Оказалось, что import_id для родительского сообщения присутствовал в таблицах topic_custom_field и post_custom_field. Кроме того, сообщение действительно существовало.

Однако оно было удалено. Похоже, ошибка «родительское сообщение не существует» возникла потому, что импорт искал информацию в базе данных Discourse, а не в index.db. Было бы неплохо получить сообщение об ошибке, указывающее, что пост был удалён.

В любом случае, я думаю, это произошло потому, что на раннем этапе тестирования я удалил первую (небольшую) партию импортированных постов. Мне казалось, что я восстановил состояние до этого момента, но, очевидно, нет.

Хорошая новость в том, что это касается только моего тестового сервера, и на живом сервере при импорте такой проблемы возникнуть не должно.

Спасибо за подсказки.

Почему? Кем?

При импорте такого не происходит.

Звучит логично. Удаление постов не стирает их, а помечает как удалённые.