Il messaggio genitore non esiste

Durante l’importazione di mbxs ricevo un errore che indica che il messaggio genitore non esiste, anche se sembra essere presente nel database, index.db.

Ecco l’errore:

Il messaggio genitore 9205270657.AB03850@ben.dciem.dnd.ca non esiste. Si salta 9206031720.AA22567@ben.dciem.dnd.ca: A CALL FOR HELP

Ecco la voce nel database:

Annotation 2020-02-16 155700

Hai qualche suggerimento sul motivo per cui questo fallisce?

Forse l’ordine di ordinamento è errato perché stai raggruppando le email per oggetto? Potrebbe valere la pena indagare. I messaggi vengono ordinati solo in base a Subject e all’ordine delle email nel file mbox.

Sei davvero sicuro di dover raggruppare le email per oggetto? A giudicare dallo screenshot, sembra che le email abbiano anche gli header Message-ID, In-Reply-To e References corretti.

Grazie. Guardando la tabella email_order, sembrano essere nell’ordine corretto:

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

Potrebbe esserci qualcos’altro che impedisce l’importazione di questi messaggi genitori?

Quando ho eseguito la prima importazione, sembrava non esserci alcun raggruppamento. Credo che il problema sia che le risposte sono indirizzate alla mailing list piuttosto che all’originatore. Inoltre, alcuni messaggi non hanno affatto questi campi, poiché l’archivio è stato assemblato manualmente nel corso di 28 anni in modo piuttosto disordinato, con diverse versioni di Eudora.

Forse non riesce a importare il messaggio genitore? Si è verificato un errore? È difficile capire perché non riesca a trovare il messaggio. Mi dispiace, ma immagino che dovrai eseguire il debug da solo modificando il codice Ruby dello script di importazione.

No, non credo ci sia stato un errore.

Va bene, anche se non sono familiare con Ruby o lo script di importazione, potrei provare a farlo.

Puoi indicarmi quali script esaminare e dove si trovano? “Debug” significa aggiungere istruzioni di stampa o esiste una funzionalità più sofisticata?

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

Beh, ho aggiunto un paio di debug con print a 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

Questi stampano correttamente e suggeriscono che il messaggio padre è stato mappato (importato?)

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

Quindi, non capisco perché il messaggio padre risulti vuoto in map_reply. L’unica cosa che noto è che i numeri (873/874) sono uno in meno rispetto al rowid sopra.

Ma non credo di poter procedere oltre, poiché non so cosa stia facendo @lookup.topic_lookup_from_imported_post_id e modificare con vi e rieseguire l’importazione è molto laborioso, con ogni ciclo che richiede circa 30 minuti.

Si trova in base.rb nella stessa directory. Sta facendo esattamente ciò che suggerisce il nome della funzione: cerca il topic_id trovando l’import_id (che presumo sia l’ID del messaggio in questo caso) in un campo personalizzato del topic (o forse in un campo personalizzato del post?).

È meglio di quelli che richiedono una settimana. :wink: (A volte puoi fare in modo che lo script di importazione importi solo ciò che stai cercando di debuggare; capire come farlo è lasciato come esercizio al lettore.)

Puoi provare a consultare il database e verificare se il messaggio genitore viene importato e se ha un campo personalizzato topic/post import_id.

Dove sta cercando? Il topic_id è l’oggetto?

Con ‘database’ intendi index.db? Con ‘importato’ intendi inserito nella tabella email di index.db? Sì, è lì. Ma non c’è nessuna colonna chiamata ‘import_id’.

Con database mi riferisco al database di Discourse. L’ID di importazione si trova nelle tabelle topic_custom_field e post_custom_field.

Aha!

Ho importato il plugin Data Explorer e ho esaminato il database di Discourse. Ho scoperto che l’import_id del messaggio genitore era presente nelle tabelle topic_custom_field e post_custom_field. Inoltre, il messaggio esisteva.

Tuttavia, era stato eliminato. Quindi, immagino di aver ricevuto l’errore “il messaggio genitore non esiste” perché l’importazione stava cercando nel database di Discourse invece che in index.db. Sarebbe stato utile ricevere un messaggio di errore che indicasse che il post era stato eliminato.

Comunque, credo che questo sia accaduto perché, durante un test iniziale, avevo eliminato il primo lotto (piccolo) di post importati. Pensavo di aver ripristinato lo stato precedente a quel punto, ma chiaramente non è stato così.

La cosa positiva è che questo problema riguarda solo il mio server di test e non dovrei incontrarlo durante l’importazione sul server live.

Grazie per i suggerimenti.

Perché? Da chi?

Questo non è qualcosa che si verifica durante un’importazione.

Ha senso. E l’eliminazione dei post non li cancella fisicamente, ma li marca come eliminati.