Mi scuso innanzitutto con chiunque si senta attaccato da questo post perché, ad essere sincero, è da lunedì che mi districo con questi problemi e a questo punto sono stanco di fare debug/hotfix per il codice di Discourse.
Dopo l’ennesimo tentativo (smetto di contare dopo il settimo) penso che mi arrenderò perché sembra che la migrazione non sia qualcosa su cui Discourse abbia investito molto tempo per supportarla.
Credo che il problema più grande sia che il charset utilizzato in questo enorme database sia utf8mb4, che non è supportato dallo script (?).
Usare utf8 (predefinito) genera semplicemente molti errori che vengono segnalati ma non è chiaro cosa stia succedendo poiché lo script va avanti comunque. La voce nel DB viene saltata? Copiata con caratteri non supportati (i classici quadratini)?
Inoltre, le tre diverse ultime esecuzioni (utilizzando gli importatori di massa), seguendo esattamente le stesse istruzioni, hanno risultati diversi. Quest’ultima esecuzione ha raggiunto l’importazione degli argomenti, ha iniziato immediatamente a segnalare errori ma è andata avanti (???):
Caricamento applicazione...
Avvio...
Precaricamento I18n...
Correzione numeri post più alti...
Caricamento ID gruppi importati...
Caricamento ID utenti importati...
Caricamento ID categorie importate...
Caricamento ID argomenti importati...
Caricamento ID post importati...
Caricamento indici gruppi...
Caricamento indici utenti...
Caricamento indici categorie...
Caricamento indici argomenti...
Caricamento indici post...
Caricamento indici azioni post...
Importazione categorie...
Importazione categorie padre...
5 - 1104/secERRORE: violazione del vincolo di univocità della chiave "unique_index_categories_on_name"
DETTAGLIO: La chiave (COALESCE(parent_category_id, '-1'::integer), name)=(-1, Armata Brancaleone) esiste già.
CONTESTO: COPY categories, riga 69
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/pg-1.4.5/lib/pg/connection.rb:204:in `get_last_result'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/pg-1.4.5/lib/pg/connection.rb:204:in `copy_data'
/var/www/discourse/script/bulk_import/base.rb:720:in `create_records'
/var/www/discourse/script/bulk_import/base.rb:361:in `create_categories'
script/bulk_import/vbulletin5.rb:291:in `import_categories'
script/bulk_import/vbulletin5.rb:69:in `execute'
/var/www/discourse/script/bulk_import/base.rb:98:in `run'
script/bulk_import/vbulletin5.rb:779:in `<main>'
Importazione argomenti...
600 - 4073/sec
ERRORE: metodo non definito `[]' per nil:NilClass
/var/www/discourse/script/bulk_import/base.rb:513:in `process_topic'
/var/www/discourse/script/bulk_import/base.rb:724:in `block (2 levels) in create_records'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/mysql2/alias_method.rb:8:in `each'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/mysql2/alias_method.rb:8:in `each'
/var/www/discourse/script/bulk_import/base.rb:721:in `block in create_records'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/pg-1.4.5/lib/pg/connection.rb:196:in `copy_data'
/var/www/discourse/script/bulk_import/base.rb:720:in `create_records'
/var/www/discourse/script/bulk_import/base.rb:364:in `create_topics'
script/bulk_import/vbulletin5.rb:321:in `import_topics'
script/bulk_import/vbulletin5.rb:70:in `execute'
/var/www/discourse/script/bulk_import/base.rb:98:in `run'
script/bulk_import/vbulletin5.rb:779:in `<main>'
Fino a quando finalmente non si blocca con questo:
script/bulk_import/vbulletin5.rb:779:in `<main>'
572329 - 531/sec
Importazione risposte...
client_loop: send disconnect: Connection reset
Ma non prima di aver spammato quasi costantemente questi due errori:
ERRORE: metodo non definito `gsub!' per nil:NilClass
script/bulk_import/vbulletin5.rb:727:in `preprocess_raw'
script/bulk_import/vbulletin5.rb:369:in `block in import_topic_first_posts'
/var/www/discourse/script/bulk_import/base.rb:723:in `block (2 levels) in create_records'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/mysql2/alias_method.rb:8:in `each'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/mysql2/alias_method.rb:8:in `each'
/var/www/discourse/script/bulk_import/base.rb:721:in `block in create_records'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/pg-1.4.5/lib/pg/connection.rb:196:in `copy_data'
/var/www/discourse/script/bulk_import/base.rb:720:in `create_records'
/var/www/discourse/script/bulk_import/base.rb:367:in `create_posts'
script/bulk_import/vbulletin5.rb:361:in `import_topic_first_posts'
script/bulk_import/vbulletin5.rb:71:in `execute'
/var/www/discourse/script/bulk_import/base.rb:98:in `run'
script/bulk_import/vbulletin5.rb:779:in `<main>'
e
ERRORE: sequenza di byte non valida in UTF-8
script/bulk_import/vbulletin5.rb:727:in `gsub!'
script/bulk_import/vbulletin5.rb:727:in `preprocess_raw'
script/bulk_import/vbulletin5.rb:369:in `block in import_topic_first_posts'
/var/www/discourse/script/bulk_import/base.rb:723:in `block (2 levels) in create_records'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/mysql2/alias_method.rb:8:in `each'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/mysql2/alias_method.rb:8:in `each'
/var/www/discourse/script/bulk_import/base.rb:721:in `block in create_records'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/pg-1.4.5/lib/pg/connection.rb:196:in `copy_data'
/var/www/discourse/script/bulk_import/base.rb:720:in `create_records'
/var/www/discourse/script/bulk_import/base.rb:367:in `create_posts'
script/bulk_import/vbulletin5.rb:361:in `import_topic_first_posts'
script/bulk_import/vbulletin5.rb:71:in `execute'
/var/www/discourse/script/bulk_import/base.rb:98:in `run'
script/bulk_import/vbulletin5.rb:779:in `<main>'
Si noti che sono andato passo dopo passo commentando quale funzione eseguire, quindi eseguendo rake import:ensure_consistency prima di continuare commentando quelle che erano appena state eseguite e così via, perché se lasciassi semplicemente l’intero script rieseguire i passaggi precedenti, si bloccherebbe semplicemente trovando ID duplicati.
Prima che esca il solito argomento “non puoi lamentarti del software gratuito”, voglio chiarire che contribuisco ad altri progetti open source e realizzo software gratuitamente anch’io, ma per me è fondamentale che se rilascio qualcosa, quella cosa funzioni e sia ben documentata (anche solo per evitare le migliaia di messaggi che chiedono giustamente “come funziona”) o sono pronto a correggere qualsiasi bug emerga.
Mentre Discourse sembra offrire un’ottima esperienza “out-of-the-box”, dovrebbe essere chiaro che siamo nel 2022 e le comunità sono esistite molto prima di questo prodotto. L’“adozione” richiederebbe un forte supporto alla migrazione e non sembra essere lo stato attuale per Discourse.
Riconosco che un database da 20 GB sia un caso limite, ma non abbiamo problemi con la dimensione qui, piuttosto con il charset o chissà cos’altro, dato che non c’è nemmeno un errore costante e la maggior parte delle volte: non c’è documentazione oltre a dover cercare thread e post lasciati da chi ha attraversato la stessa odissea in passato, sperando che sia stata trovata una soluzione e che il codice sorgente non sia cambiato molto da allora.
A questo punto raccomanderei vivamente a chiunque provenga da vBulletin di sospendere qualsiasi migrazione fino a quando non sarà completato quello che sembra essere un rifacimento dello script di migrazione (in corso, a quanto pare?).