Je vais commencer par m’excuser auprès de quiconque se sentirait attaqué par ce post car, pour être honnête, c’est depuis lundi que je me bats avec ces problèmes et à ce stade, je suis fatigué de faire du débogage/hotfix pour le code de Discourse.
Après la n-ième tentative (j’ai arrêté de compter après la 7ème), je pense que je vais abandonner car il semble que la migration ne soit pas quelque chose que Discourse ait beaucoup investi pour supporter.
Je crois que le plus gros problème est que le jeu de caractères utilisé dans cette énorme base de données est utf8mb4, ce qui n’est pas supporté par le script (?).
Utiliser utf8 (par défaut) génère simplement beaucoup d’erreurs qui sont signalées mais il n’est pas clair ce qui se passe car le script continue quand même. L’entrée dans la base de données est-elle ignorée ? Copiée avec des caractères non supportés (les carrés classiques) ?
De plus, les trois dernières exécutions différentes (en utilisant les importateurs en masse), avec exactement le même ensemble d’instructions suivies, ont des résultats différents. Cette dernière exécution a atteint l’importation des sujets, a immédiatement commencé à signaler des erreurs mais a continué (???):
Loading application...
Starting...
Preloading I18n...
Fixing highest post numbers...
Loading imported group ids...
Loading imported user ids...
Loading imported category ids...
Loading imported topic ids...
Loading imported post ids...
Loading groups indexes...
Loading users indexes...
Loading categories indexes...
Loading topics indexes...
Loading posts indexes...
Loading post actions indexes...
Importing categories...
Importing parent categories...
5 - 1104/sec
Importing children categories...
500 - 1539/secERROR: duplicate key value violates unique constraint "unique_index_categories_on_name"
DETAIL: Key (COALESCE(parent_category_id, '-1'::integer), name)=(-1, Armata Brancaleone) already exists.
CONTEXT: COPY categories, line 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>'
Importing topics...
600 - 4073/sec
ERROR: undefined method `[]' for 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>'
Jusqu’à finalement planter sur celui-ci :
script/bulk_import/vbulletin5.rb:779:in `<main>'
572329 - 531/sec
Importing replies...
client_loop: send disconnect: Connection reset
Mais pas avant de spammer constamment ces deux erreurs :
ERROR: undefined method `gsub!' for 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>'
et
ERROR: invalid byte sequence 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>'
Veuillez noter que j’ai procédé étape par étape en commentant la fonction à exécuter, puis en exécutant rake import:ensure_consistency avant de continuer en commentant celles qui venaient d’être exécutées et ainsi de suite, car si je laisse le script entier réexécuter les étapes précédentes, il plante simplement en trouvant des ID dupliqués.
Avant que l’argument habituel “on ne peut pas se plaindre du logiciel gratuit” ne sorte, je tiens à préciser que je contribue à d’autres projets open source et que je crée également des logiciels gratuitement, mais il est primordial pour moi que si je publie quelque chose, cela fonctionne et soit bien documenté (ne serait-ce que pour éviter les milliers de messages demandant à juste titre “comment cela fonctionne”) ou je suis prêt à corriger tous les bugs qui surviennent.
Bien que Discourse semble offrir une excellente expérience prête à l’emploi, il doit être clair qu’en 2022, les communautés existaient bien avant ce produit. “L’adoption” nécessiterait un solide support de migration, ce qui ne semble pas être le cas actuellement pour Discourse.
Je reconnais qu’une base de données de 20 Go est un cas extrême, mais nous n’avons pas de problème de taille ici, plutôt de jeu de caractères ou de je-ne-sais-quoi car il n’y a même pas d’erreur constante et la plupart du temps, il n’y a pas de documentation à part devoir chercher des fils de discussion et des posts laissés par ceux qui sont passés par la même épreuve par le passé, en espérant qu’une solution de contournement ait été trouvée et que le code source n’ait pas beaucoup changé depuis.
À ce stade, je recommanderais fortement à quiconque venant de vBulletin de suspendre toute migration jusqu’à ce que ce qui semble être une refonte du script de migration (en cours, semble-t-il ?) soit terminée.