Rake posts:reorder_posts gera erro `UniqueViolation`

Contexto: Estou tentando dividir uma postagem. Para fazer isso, acho que preciso:

  • Criar uma nova postagem no tópico.
  • Editar o conteúdo de ambas as postagens como eu quiser.
  • Alterar o proprietário da postagem que criei para corresponder à original.
  • Alterar o timestamp da postagem que criei para corresponder à original (talvez adicionando alguns segundos).
  • Executar posts:reorder_posts[topic_id] para mover minha resposta para a posição correta no tópico.

A primeira coisa que tentei foi a invocação de posts:reorder_post, “só para ver”, mas falhou:

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)

Interessantemente, não vejo nenhuma postagem numerada como 93 no tópico. Vejo 92 e 94. O usuário 1 sou eu, mas as postagens 92 e 94 não são minhas.

Eu já dividi o tópico anteriormente, então talvez a postagem 93 tenha sido movida para outro tópico, não sei.

1 curtida

encontrando o mesmo problema, mesmo rastreamento. Existe uma resolução?

Acho que isso não é possível. O post_number seria recalculado se uma postagem fosse separada do tópico (já que não é um post_id, mas a ordem das postagens no tópico). Poderia ser uma pequena ação de postagem que não parece uma postagem ‘real’, mas ainda conta como uma (sussurros também contariam, mas se você está executando tarefas rake, presumo que você seja um administrador que pode vê-los).

Eu me pergunto se excluir a pequena ação de postagem teria ajudado nesta situação? Isso parece ser o problema para você, @UndecidedAdmin?

2 curtidas

Não tenho certeza se entendi o que você quer dizer. Não tenho certeza do que é um “small action post”, embora se for um post sobre divisão de tópicos, sim, esse pode ser o problema. Estou recebendo este erro:

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.

Quando vou para essa URL:

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

O post é na verdade 2151, e diz “Split this topic on Dec 11, 2021”. O post imediatamente acima é 2143, então estou imaginando que 2150 foi movido para um tópico diferente, e alguma tabela tem uma referência incorreta para ele.

1 curtida

Em Unable to move posts between topics - #2 by nat, uma correção para este erro foi anunciada.

3 curtidas

Este tópico foi fechado automaticamente 90 dias após a última resposta. Novas respostas não são mais permitidas.