Rake-Posts:reorder_posts verursacht `UniqueViolation`-Fehler

Kontext: Ich versuche, einen Beitrag aufzuteilen. Dazu glaube ich, dass ich Folgendes tun muss:

  • Einen neuen Beitrag im Thema erstellen.
  • Den Inhalt beider Beiträge nach Wunsch bearbeiten.
  • Den Besitzer des von mir erstellten Beitrags ändern, damit er mit dem Original übereinstimmt.
  • Die Zeitstempel des von mir erstellten Beitrags ändern, damit sie mit dem Original übereinstimmen (vielleicht ein paar Sekunden hinzufügen).
  • posts:reorder_posts[topic_id] ausführen, um meine Antwort an die richtige Stelle im Thema zu verschieben.

Das Erste, was ich versucht habe, war der Aufruf von posts:reorder_post, „nur um zu sehen“, aber er schlug fehl:

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)

Interessanterweise sehe ich keinen Beitrag mit der Nummer 93 in dem Thema. Ich sehe 92 und 94. Benutzer 1 bin ich, aber die Beiträge 92 und 94 sind nicht von mir.

Ich habe das Thema zuvor aufgeteilt, vielleicht wurde 93 in ein anderes Thema verschoben, ich weiß es nicht.

1 „Gefällt mir“

Ich stoße auf dasselbe Problem, derselbe Trace. Gibt es eine Lösung?

Ich glaube nicht, dass das möglich ist. Die Beitragsnummer würde neu berechnet, wenn ein Beitrag aus dem Thema herausgelöst würde (da es sich nicht um eine Beitrags-ID handelt, sondern um die Reihenfolge der Beiträge im Thema). Es könnte ein kleiner Aktionsbeitrag sein, der nicht wie ein „echter“ Beitrag aussieht, aber trotzdem als einer zählt (Flüstern würde auch zählen, aber wenn Sie Rake-Aufgaben ausführen, gehe ich davon aus, dass Sie ein Administrator sind, der sie sehen kann).

Ich frage mich, ob das Löschen des kleinen Aktionsbeitrags in dieser Situation geholfen hätte? Klingt das nach dem Problem für Sie, @UndecidedAdmin?

2 „Gefällt mir“

Ich bin mir nicht sicher, was Sie meinen. Ich bin mir nicht sicher, was ein „Small Action Post“ ist, obwohl es, wenn es sich um einen Beitrag über das Aufteilen von Themen handelt, ja, das könnte das Problem sein. Ich erhalte diese Fehlermeldung:

PG::UniqueViolation: ERROR: duplicate key value violates unique constraint „post_timings_unique“ (PG::UniqueViolation)
DETAIL: Key (topic_id, post_number, user_id)=(54, 2150, 1) already exists.

Wenn ich zu dieser URL gehe:

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

Der Beitrag ist tatsächlich 2151 und es heißt „Dieses Thema am 11. Dezember 2021 aufgeteilt“. Der unmittelbar darüber liegende Beitrag ist 2143, daher vermute ich, dass 2150 in ein anderes Thema verschoben wurde und eine Tabelle eine falsche Referenz darauf hat.

1 „Gefällt mir“

In Unable to move posts between topics - #2 by nat wurde eine Korrektur für diesen Fehler angekündigt.

3 „Gefällt mir“

Dieses Thema wurde 90 Tage nach der letzten Antwort automatisch geschlossen. Neue Antworten sind nicht mehr möglich.