A mensagem pai não existe

Ao importar mbxs, estou recebendo um erro de que a mensagem pai não existe, mesmo parecendo estar no banco de dados, index.db.

Aqui está o erro:

A mensagem pai 9205270657.AB03850@ben.dciem.dnd.ca não existe. Ignorando 9206031720.AA22567@ben.dciem.dnd.ca: A CALL FOR HELP

e aqui está a entrada do banco de dados:

Annotation 2020-02-16 155700

Alguma sugestão sobre por que isso está falhando?

Talvez a ordem de classificação esteja incorreta porque você está agrupando e-mails por assunto? Vale a pena investigar. As mensagens são classificadas apenas por Subject e pela ordem dos e-mails dentro do arquivo mbox.

Você tem certeza de que precisa agrupar os e-mails por assunto? A julgar pela sua captura de tela, parece que os e-mails possuem Message-ID, bem como os cabeçalhos In-Reply-To e References corretos.

Obrigado. Analisando a tabela email_order, elas parecem estar na ordem correta:

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

Poderia haver algo mais impedindo a importação dessas mensagens pai?

Quando fiz a primeira importação, parecia que não havia nenhum agrupamento. Acredito que o problema seja que as respostas são direcionadas à lista de discussão e não ao remetente original. Além disso, algumas mensagens não possuem esses campos, já que o arquivo foi montado manualmente ao longo de 28 anos de forma bastante desorganizada, com diferentes versões do Eudora.

Talvez ele falhe ao importar a mensagem pai? Houve algum erro? É difícil dizer por que ele não encontra a mensagem. Sinto muito, mas acho que você precisará depurar isso você mesmo, modificando o código Ruby do script de importação.

Não, não acredito que tenha havido um erro.

Ok, embora eu não esteja familiarizado com Ruby ou o script de importação, posso tentar.

Pode me dizer quais scripts procurar e onde eles estão? “Depurar” significa adicionar instruções de impressão ou há funcionalidades mais sofisticadas?

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

Bem, adicionei alguns prints de debug ao map_first_post

def map_first_post(row)
  puts "Mapeando pai #{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 "Mensagem mapeada #{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 "Mensagem pai #{row['in_reply_to']} não existe. Ignorando #{row['msg_id']}: #{row['subject'][0..40]}"
    return nil
  end

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

Esses prints funcionam e sugerem que o pai foi mapeado (importado?)

873 / 65936 ( 1.3%) [3895 itens/min]
Mapeando pai 9205270657.AB03850@ben.dciem.dnd.ca A CALL FOR HELP
Mensagem mapeada 9205270657.AB03850@ben.dciem.dnd.ca A CALL FOR HELP
874 / 65936 ( 1.3%) [3900 itens/min]
Mensagem pai 9205270657.AB03850@ben.dciem.dnd.ca não existe. Ignorando 9206031720.AA22567@ben.dciem.dnd.ca: A CALL FOR HELP

Então, não vejo por que o pai estaria em branco no map_reply. A única coisa que notei é que os números (873/874) são um a menos que o rowid acima.

Mas acho que não consigo avançar muito mais, pois não sei o que @lookup.topic_lookup_from_imported_post_id está fazendo e é muito trabalhoso editar com vi e relançar a importação, com cada ciclo levando cerca de 30 minutos.

Ele está em base.rb, no mesmo diretório. E está fazendo exatamente o que o nome da função sugere: está procurando o topic_id ao encontrar o import_id (que, presumo, seja o ID da mensagem neste caso) em um campo personalizado do tópico (ou talvez de um post?).

Isso é melhor do que aqueles que levam uma semana. :wink: (Às vezes, é possível fazer com que o script de importação importe apenas o que você está tentando depurar; descobrir como fazer isso fica como um exercício para o leitor.)

Você pode tentar verificar no banco de dados se a mensagem pai está sendo importada e se ela possui um campo personalizado de tópico/post com import_id.

Onde está procurando? O topic_id é o assunto?

Por ‘banco de dados’, você quer dizer index.db? Por ‘importada’, você quer dizer inserida na tabela de e-mails do index.db? Sim, ela está lá. Mas não há nenhuma coluna chamada ‘import_id’.

Por banco de dados, quero dizer o banco de dados do Discourse. O ID de importação está nas tabelas topic_custom_field e post_custom_field.

Aha!

Importei o plugin Data Explorer e examinei o banco de dados do Discourse. Percebi que o import_id da mensagem pai estava presente nas tabelas topic_custom_field e post_custom_field. Além disso, a mensagem realmente existia.

No entanto, ela havia sido excluída. Então, imagino que tenha recebido o erro “mensagem pai não existe” porque a importação estava consultando o banco de dados do Discourse em vez do index.db. Seria bom receber uma mensagem de erro informando que a postagem havia sido excluída.

De qualquer forma, acredito que isso ocorreu porque, durante um teste inicial, eu havia excluído o primeiro lote (pequeno) de postagens importadas. Achei que tivesse restaurado o sistema para antes desse ponto, mas claramente não foi isso que aconteceu.

A boa notícia é que isso só se aplica ao meu servidor de testes e não devo ter esse problema na importação no servidor de produção.

Obrigado pelas dicas.

Por quê? Por quem?

Isso não acontece em uma importação.

Parece correto. E excluir postagens não as remove, mas as marca como excluídas.