Rake posts:reorder_posts genera error `UniqueViolation`

Contexto: Estoy intentando dividir una publicación. Para hacerlo, creo que necesito:

  • Crear una nueva publicación en el tema.
  • Editar el contenido de ambas publicaciones como quiera.
  • Cambiar el propietario de la publicación que creé para que coincida con la original.
  • Cambiar la marca de tiempo de la publicación que creé para que coincida con la original (tal vez añadiendo unos segundos).
  • Ejecutar posts:reorder_posts[topic_id] para mover mi respuesta a la posición correcta en el tema.

Lo primero que intenté fue la invocación de posts:reorder_post, “solo para ver”, pero falló:

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)

Curiosamente, no veo ninguna publicación con el número 93 en el tema. Veo 92 y 94. El usuario 1 soy yo, pero las publicaciones 92 y 94 no son mías.

Previamente dividí el tema, así que tal vez la 93 se movió a otro tema, no lo sé.

1 me gusta

Tengo el mismo problema, mismo rastreo. ¿Hay alguna solución?

Creo que esto no es posible. El número de publicación se recalcularía si una publicación se separara del tema (ya que no es un ID de publicación, sino el orden de las publicaciones en el tema). Podría ser una pequeña publicación de acción que no parezca una publicación ‘real’, pero que aún cuente como una (los susurros también contarían, pero si estás ejecutando tareas de rake, asumo que eres un administrador que puede verlas).

Me pregunto si eliminar la pequeña publicación de acción habría ayudado en esta situación. ¿Te parece que este podría ser el problema para ti, @UndecidedAdmin?

2 Me gusta

No estoy seguro de entender a qué te refieres. No estoy seguro de qué es una “publicación de acción pequeña”, aunque si es una publicación sobre la división de temas, sí, ese podría ser el problema. Estoy recibiendo este error:

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.

Cuando voy a esa URL:

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

La publicación es en realidad 2151, y dice “Dividir este tema el 11 de diciembre de 2021”. La publicación inmediatamente anterior es 2143, por lo que supongo que la 2150 se movió a un tema diferente, y alguna tabla tiene una referencia incorrecta a ella.

1 me gusta

En Unable to move posts between topics - #2 by nat se anunció una solución para este error.

3 Me gusta

Este tema se cerró automáticamente 90 días después de la última respuesta. Ya no se permiten nuevas respuestas.