Rake posts:reorder_posts donne une erreur `UniqueViolation`

Contexte : J’essaie de diviser un message. Pour ce faire, je pense que je dois :

  • Créer un nouveau message dans le sujet.
  • Modifier le contenu des deux messages comme je le souhaite.
  • Changer le propriétaire du message que j’ai créé pour qu’il corresponde à l’original.
  • Changer l’horodatage du message que j’ai créé pour qu’il corresponde à l’original (peut-être en ajoutant quelques secondes).
  • Exécuter posts:reorder_posts[topic_id] pour déplacer ma réponse à la bonne position dans le sujet.

La première chose que j’ai essayée a été l’invocation de posts:reorder_post, « juste pour voir », mais cela a échoué :

root@discourse1-app:/var/www/discourse# rake "posts:reorder_posts[879]"
rake aborted!
PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "post_timings_unique"
DETAIL:  Key (topic_id, post_number, user_id)=(879, 93, 1) already exists.
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/pg.rb:110:in `exec'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/pg.rb:110:in `async_exec'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/mini_sql-1.4.0/lib/mini_sql/postgres/connection.rb:209:in `run'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/mini_sql-1.4.0/lib/mini_sql/active_record_postgres/connection.rb:38:in `block in run'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/mini_sql-1.4.0/lib/mini_sql/active_record_postgres/connection.rb:34:in `block in with_lock'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activesupport-7.0.4.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `handle_interrupt'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activesupport-7.0.4.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `block in synchronize'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activesupport-7.0.4.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `handle_interrupt'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activesupport-7.0.4.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/mini_sql-1.4.0/lib/mini_sql/active_record_postgres/connection.rb:34:in `with_lock'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/mini_sql-1.4.0/lib/mini_sql/active_record_postgres/connection.rb:38:in `run'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/mini_sql-1.4.0/lib/mini_sql/postgres/connection.rb:181:in `exec'
/var/www/discourse/lib/tasks/posts.rake:383:in `block (3 levels) in <main>'
/var/www/discourse/lib/tasks/posts.rake:366:in `each'
/var/www/discourse/lib/tasks/posts.rake:366:in `block (2 levels) in <main>'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activerecord-7.0.4.1/lib/active_record/connection_adapters/abstract/transaction.rb:319:in `block in within_new_transaction'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activesupport-7.0.4.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `handle_interrupt'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activesupport-7.0.4.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `block in synchronize'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activesupport-7.0.4.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `handle_interrupt'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activesupport-7.0.4.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activerecord-7.0.4.1/lib/active_record/connection_adapters/abstract/transaction.rb:317:in `within_new_transaction'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activerecord-7.0.4.1/lib/active_record/connection_adapters/abstract/database_statements.rb:316:in `transaction'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activerecord-7.0.4.1/lib/active_record/transactions.rb:209:in `transaction'
/var/www/discourse/lib/tasks/posts.rake:329:in `block in <main>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'
Tasks: TOP => posts:reorder_posts
(See full trace by running task with --trace)

Étonnamment, je ne vois aucun message numéroté 93 dans le sujet. Je vois 92 et 94. L’utilisateur 1, c’est moi, mais les messages 92 et 94 ne sont pas de moi.

J’ai déjà divisé le sujet, donc peut-être que le 93 a été déplacé dans un autre sujet, je ne sais pas.

1 « J'aime »

Je rencontre le même problème, la même trace. Y a-t-il une solution ?

Je pense que ce n’est pas possible. Le numéro du message serait recalculé si un message était séparé du sujet (car ce n’est pas un ID de message, mais l’ordre des messages dans le sujet). Il pourrait s’agir d’une petite action qui ne ressemble pas à un « vrai » message, mais qui compte quand même comme tel (les murmures compteraient aussi, mais si vous exécutez des tâches rake, je suppose que vous êtes un administrateur qui peut les voir).

Je me demande si la suppression du petit message d’action aurait aidé dans cette situation ? Est-ce que cela pourrait être le problème pour vous @UndecidedAdmin ?

2 « J'aime »

Je ne suis pas sûr de comprendre ce que vous voulez dire. Je ne suis pas sûr de ce qu’est un « petit post d’action », bien que s’il s’agit d’un post sur la division de sujets, oui, cela pourrait être le problème. Je reçois cette erreur :

PG::UniqueViolation : ERREUR : la violation de la clé unique viole la contrainte d’unicité « post_timings_unique » (PG::UniqueViolation)
DÉTAIL : La clé (topic_id, post_number, user_id)=(54, 2150, 1) existe déjà.

Quand je vais à cette URL :

https://[site]/t/[slug]/54/2150

Le post est en fait 2151, et il est indiqué « Sujet divisé le 11 déc. 2021 ». Le post immédiatement au-dessus est 2143, donc je suppose que 2150 a été déplacé vers un autre sujet, et qu’une table a une mauvaise référence à celui-ci.

1 « J'aime »

Dans Unable to move posts between topics - #2 by nat, une correction pour cette erreur a été annoncée.

3 « J'aime »

Ce sujet a été automatiquement fermé 90 jours après la dernière réponse. De nouvelles réponses ne sont plus autorisées.