El mensaje padre no existe

Al importar mbxs, obtengo un error indicando que el mensaje padre no existe, aunque parece estar en la base de datos, index.db.

Aquí está el error:

El mensaje padre 9205270657.AB03850@ben.dciem.dnd.ca no existe. Se omite 9206031720.AA22567@ben.dciem.dnd.ca: A CALL FOR HELP

y aquí está la entrada de la base de datos:

Annotation 2020-02-16 155700

¿Alguna sugerencia sobre por qué esto está fallando?

2 Me gusta

Quizás el orden de clasificación sea incorrecto porque estás agrupando los correos electrónicos por asunto. Podría valer la pena investigarlo. Los mensajes solo se ordenan por Subject y por el orden de los correos dentro del archivo mbox.

¿Estás realmente seguro de que necesitas agrupar los correos electrónicos por asunto? A juzgar por tu captura de pantalla, parece que los correos tienen el Message-ID correcto, así como las cabeceras In-Reply-To y References.

3 Me gusta

Gracias. Al observar la tabla email_order, parecen estar en el orden correcto:

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

¿Podría haber algo más que impida importar estos mensajes padres?

Cuando hice la primera importación, parecía que no había ningún agrupamiento. Creo que el problema es que las respuestas están dirigidas a la lista de correo y no al remitente original. Además, algunos mensajes no tienen esos campos en absoluto, ya que el archivo fue compilado manualmente durante 28 años de manera bastante desordenada con diferentes versiones de Eudora.

¿Quizás no logra importar el mensaje principal? ¿Hubo algún error? Es difícil saber por qué no encuentra el mensaje. Lo siento, pero creo que tendrás que depurarlo tú mismo modificando el código Ruby del script de importación.

1 me gusta

No, no creo que haya habido un error.

Vale, aunque no estoy familiarizado con Ruby ni con el script de importación, pero quizás pueda intentarlo.

¿Podrías indicarme qué scripts debo revisar y dónde se encuentran? ¿“Depurar” significa agregar sentencias de impresión o hay una funcionalidad más sofisticada?

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

1 me gusta

Bueno, agregué algunos debugs con print a map_first_post

def map_first_post(row)
  puts "Mapeando padre #{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 "Mensaje mapeado #{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 "El mensaje padre #{row['in_reply_to']} no existe. Saltando #{row['msg_id']}: #{row['subject'][0..40]}"
    return nil
  end

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

Estos prints funcionan bien y sugieren que el padre está mapeado (¿importado?)

873 / 65936 ( 1.3%) [3895 elementos/min]
Mapeando padre 9205270657.AB03850@ben.dciem.dnd.ca A CALL FOR HELP
Mensaje mapeado 9205270657.AB03850@ben.dciem.dnd.ca A CALL FOR HELP
874 / 65936 ( 1.3%) [3900 elementos/min]
El mensaje padre 9205270657.AB03850@ben.dciem.dnd.ca no existe. Saltando 9206031720.AA22567@ben.dciem.dnd.ca: A CALL FOR HELP

Así que no veo por qué el padre está en blanco en map_reply. Lo único que noto es que los números (873/874) son uno menos que el rowid anterior.

Pero creo que no puedo avanzar mucho más, ya que no sé qué hace @lookup.topic_lookup_from_imported_post_id y es muy laborioso editar con vi y volver a ejecutar la importación, con cada ciclo tomando alrededor de 30 minutos.

Está en base.rb, en el mismo directorio. Y hace exactamente lo que sugiere el nombre de la función: busca el topic_id encontrando el import_id (que, supongo, es el ID del mensaje en este caso) en un campo personalizado de tema (¿o quizás de publicación?).

Eso es mejor que los que tardan una semana. :wink: (A veces puedes hacer cosas para que el script de importación solo importe lo que estás tratando de depurar; averiguar cómo hacerlo queda como ejercicio para el lector.)

Puedes intentar revisar la base de datos y ver si el mensaje padre se está importando y si tiene un campo personalizado de tema/publicación llamado import_id.

1 me gusta

¿Dónde busca? ¿Es el topic_id el asunto?

¿Con ‘base de datos’ te refieres a index.db? ¿Con ‘importado’ te refieres a que se introdujo en la tabla de correos de index.db? Sí, está ahí. Pero no hay ninguna columna llamada ‘import_id’.

Por base de datos me refiero a la base de datos de Discourse. El ID de importación se encuentra en las tablas topic_custom_field y post_custom_field.

¡Ajá!

Importé el plugin de explorador de datos y revisé la base de datos de Discourse. Descubrí que el import_id del mensaje padre estaba presente en las tablas topic_custom_field y post_custom_field. Además, el mensaje existía.

Sin embargo, había sido eliminado. Así que, supongo, recibí el error “el mensaje padre no existe” porque la importación estaba buscando en la base de datos de Discourse en lugar de en index.db. Habría sido útil recibir un mensaje de error indicando que la publicación había sido eliminada.

De todos modos, creo que esto ocurrió porque, durante una prueba temprana, eliminé el primer lote (pequeño) de publicaciones importadas. Pensé que había restaurado el estado anterior a ese momento, pero claramente no fue así.

Lo bueno es que esto solo aplica a mi servidor de pruebas y no debería tener el problema en la importación del servidor en vivo.

Gracias por las indicaciones.

¿Por qué? ¿Por quién?

Esto no es algo que ocurra durante una importación.

Tiene sentido. Y eliminar publicaciones no las borra, sino que las marca como eliminadas.