Erreur serveur interne lors de l'utilisation de certains tags (ERROR: duplicate key value violates unique constraint "index_tags_on_name")

This seems to be an odd problem as it is only effecting some tags - when trying to create a Topic with the tag the user is shown an Internal Server Message. Sometimes, when it gets past that stage, we are shown the same message via the review queue system. When going to the pages of these affected tags, it says Oops! That page doesn’t exist or is private.

Here are some logs:

ActiveRecord::RecordNotUnique (PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_tags_on_name"
DETAIL:  Key (name)=(ecommerce) already exists.
)
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-1.1.0/lib/patches/db/pg.rb:72:in `async_exec_params'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-1.1.0/lib/patches/db/pg.rb:72:in `async_exec_params'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-1.1.0/lib/patches/db/pg.rb:72:in `exec_params'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/postgresql_adapter.rb:668:in `block (2 levels) in exec_no_cache'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.0/lib/active_support/dependencies/interlock.rb:48:in `block in permit_concurrent_loads'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.0/lib/active_support/concurrency/share_lock.rb:187:in `yield_shares'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.0/lib/active_support/dependencies/interlock.rb:47:in `permit_concurrent_loads'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/postgresql_adapter.rb:667:in `block in exec_no_cache'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/abstract_adapter.rb:707:in `block (2 levels) in log'
/usr/local/lib/ruby/2.6.0/monitor.rb:235:in `mon_synchronize'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/abstract_adapter.rb:706:in `block in log'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.0/lib/active_support/notifications/instrumenter.rb:24:in `instrument'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/abstract_adapter.rb:697:in `log'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/postgresql_adapter.rb:666:in `exec_no_cache'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/postgresql_adapter.rb:647:in `execute_and_clear'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/postgresql/database_statements.rb:96:in `exec_query'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/abstract/database_statements.rb:135:in `exec_insert'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/postgresql/database_statements.rb:130:in `exec_insert'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/abstract/database_statements.rb:162:in `insert'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/abstract/query_cache.rb:22:in `insert'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/persistence.rb:375:in `_insert_record'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/persistence.rb:933:in `_create_record'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/counter_cache.rb:163:in `_create_record'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/locking/optimistic.rb:70:in `_create_record'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/attribute_methods/dirty.rb:211:in `_create_record'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/callbacks.rb:332:in `block in _create_record'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.0/lib/active_support/callbacks.rb:135:in `run_callbacks'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.0/lib/active_support/callbacks.rb:827:in `_run_create_callbacks'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/callbacks.rb:332:in `_create_record'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/timestamp.rb:111:in `_create_record'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/persistence.rb:906:in `create_or_update'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/callbacks.rb:328:in `block in create_or_update'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.0/lib/active_support/callbacks.rb:135:in `run_callbacks'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.0/lib/active_support/callbacks.rb:827:in `_run_save_callbacks'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/callbacks.rb:328:in `create_or_update'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/timestamp.rb:129:in `create_or_update'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/persistence.rb:470:in `save'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/validations.rb:47:in `save'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/transactions.rb:315:in `block in save'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/transactions.rb:375:in `block in with_transaction_returning_status'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/abstract/database_statements.rb:275:in `transaction'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/transactions.rb:212:in `transaction'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/transactions.rb:366:in `with_transaction_returning_status'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/transactions.rb:315:in `save'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/suppressor.rb:44:in `save'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/persistence.rb:38:in `create'
/var/www/discourse/lib/discourse_tagging.rb:62:in `block in tag_topic_by_names'
/var/www/discourse/lib/discourse_tagging.rb:60:in `each'
/var/www/discourse/lib/discourse_tagging.rb:60:in `tag_topic_by_names'
/var/www/discourse/lib/topic_creator.rb:158:in `setup_tags'
/var/www/discourse/lib/topic_creator.rb:37:in `create'
/var/www/discourse/lib/post_creator.rb:421:in `create_topic'
/var/www/discourse/lib/post_creator.rb:168:in `block in create'
/var/www/discourse/lib/post_creator.rb:345:in `block in transaction'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/abstract/database_statements.rb:275:in `transaction'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/transactions.rb:212:in `transaction'
/var/www/discourse/lib/post_creator.rb:344:in `transaction'
/var/www/discourse/lib/post_creator.rb:166:in `create'
/var/www/discourse/app/models/reviewable_queued_post.rb:80:in `perform_approve_post'
/var/www/discourse/app/models/reviewable.rb:319:in `public_send'
/var/www/discourse/app/models/reviewable.rb:319:in `block in perform'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/abstract/database_statements.rb:277:in `block in transaction'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/abstract/transaction.rb:280:in `block in within_new_transaction'
/usr/local/lib/ruby/2.6.0/monitor.rb:235:in `mon_synchronize'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/abstract/transaction.rb:278:in `within_new_transaction'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/abstract/database_statements.rb:277:in `transaction'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/transactions.rb:212:in `transaction'
/var/www/discourse/app/models/reviewable.rb:317:in `perform'
/var/www/discourse/app/controllers/reviewables_controller.rb:184:in `perform'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/abstract_controller/base.rb:196:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_controller/metal/rendering.rb:30:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/abstract_controller/callbacks.rb:42:in `block in process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.0/lib/active_support/callbacks.rb:135:in `run_callbacks'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/abstract_controller/callbacks.rb:41:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_controller/metal/rescue.rb:22:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_controller/metal/instrumentation.rb:33:in `block in process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.0/lib/active_support/notifications.rb:180:in `block in instrument'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.0/lib/active_support/notifications/instrumenter.rb:24:in `instrument'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.0/lib/active_support/notifications.rb:180:in `instrument'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_controller/metal/instrumentation.rb:32:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_controller/metal/params_wrapper.rb:245:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/railties/controller_runtime.rb:27:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/abstract_controller/base.rb:136:in `process'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionview-6.0.0/lib/action_view/rendering.rb:39:in `process'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-1.1.0/lib/mini_profiler/profiling_methods.rb:104:in `block in profile_method'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_controller/metal.rb:191:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_controller/metal.rb:252:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_dispatch/routing/route_set.rb:51:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_dispatch/routing/route_set.rb:33:in `serve'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_dispatch/journey/router.rb:49:in `block in serve'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_dispatch/journey/router.rb:32:in `each'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_dispatch/journey/router.rb:32:in `serve'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_dispatch/routing/route_set.rb:837:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-protection-2.0.7/lib/rack/protection/frame_options.rb:31:in `call'
/var/www/discourse/lib/middleware/omniauth_bypass_middleware.rb:68:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/tempfile_reaper.rb:15:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/conditional_get.rb:38:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/head.rb:12:in `call'
/var/www/discourse/lib/content_security_policy/middleware.rb:12:in `call'
/var/www/discourse/lib/middleware/anonymous_cache.rb:274:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/session/abstract/id.rb:232:in `context'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/session/abstract/id.rb:226:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_dispatch/middleware/cookies.rb:648:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_dispatch/middleware/callbacks.rb:27:in `block in call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.0/lib/active_support/callbacks.rb:101:in `run_callbacks'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_dispatch/middleware/callbacks.rb:26:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_dispatch/middleware/actionable_exceptions.rb:17:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_dispatch/middleware/debug_exceptions.rb:32:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/logster-2.3.3/lib/logster/middleware/reporter.rb:43:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.0/lib/rails/rack/logger.rb:38:in `call_app'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.0/lib/rails/rack/logger.rb:28:in `call'
/var/www/discourse/config/initializers/100-quiet_logger.rb:18:in `call'
/var/www/discourse/config/initializers/100-silence_logger.rb:31:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_dispatch/middleware/remote_ip.rb:81:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_dispatch/middleware/request_id.rb:27:in `call'
/var/www/discourse/lib/middleware/enforce_hostname.rb:17:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/method_override.rb:22:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_dispatch/middleware/executor.rb:14:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/sendfile.rb:111:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_dispatch/middleware/host_authorization.rb:77:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-1.1.0/lib/mini_profiler/profiler.rb:296:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/message_bus-2.2.2/lib/message_bus/rack/middleware.rb:57:in `call'
/var/www/discourse/lib/middleware/request_tracker.rb:176:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.0/lib/rails/engine.rb:526:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.0/lib/rails/railtie.rb:190:in `public_send'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.0/lib/rails/railtie.rb:190:in `method_missing'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/urlmap.rb:68:in `block in call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/urlmap.rb:53:in `each'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/urlmap.rb:53:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/lib/unicorn/http_server.rb:605:in `process_client'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/lib/unicorn/http_server.rb:700:in `worker_loop'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/lib/unicorn/http_server.rb:548:in `spawn_missing_workers'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/lib/unicorn/http_server.rb:144:in `start'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/bin/unicorn:128:in `<top (required)>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/bin/unicorn:23:in `load'
/var/www/discourse/vendor/bundle/ruby/2.6.0/bin/unicorn:23:in `<main>'

Failed to handle exception in exception app middleware : PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_tags_on_name"
DETAIL:  Key (name)=(ecommerce) already exists.
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-1.1.0/lib/patches/db/pg.rb:72:in `async_exec_params'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-1.1.0/lib/patches/db/pg.rb:72:in `exec_params'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/postgresql_adapter.rb:668:in `block (2 levels) in exec_no_cache'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.0/lib/active_support/dependencies/interlock.rb:48:in `block in permit_concurrent_loads'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.0/lib/active_support/concurrency/share_lock.rb:187:in `yield_shares'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.0/lib/active_support/dependencies/interlock.rb:47:in `permit_concurrent_loads'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/postgresql_adapter.rb:667:in `block in exec_no_cache'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/abstract_adapter.rb:707:in `block (2 levels) in log'
/usr/local/lib/ruby/2.6.0/monitor.rb:235:in `mon_synchronize'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/abstract_adapter.rb:706:in `block in log'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.0/lib/active_support/notifications/instrumenter.rb:24:in `instrument'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/abstract_adapter.rb:697:in `log'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/postgresql_adapter.rb:666:in `exec_no_cache'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/postgresql_adapter.rb:647:in `execute_and_clear'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/postgresql/database_statements.rb:96:in `exec_query'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/abstract/database_statements.rb:135:in `exec_insert'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/postgresql/database_statements.rb:130:in `exec_insert'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/abstract/database_statements.rb:162:in `insert'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/abstract/query_cache.rb:22:in `insert'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/persistence.rb:375:in `_insert_record'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/persistence.rb:933:in `_create_record'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/counter_cache.rb:163:in `_create_record'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/locking/optimistic.rb:70:in `_create_record'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/attribute_methods/dirty.rb:211:in `_create_record'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/callbacks.rb:332:in `block in _create_record'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.0/lib/active_support/callbacks.rb:135:in `run_callbacks'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.0/lib/active_support/callbacks.rb:827:in `_run_create_callbacks'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/callbacks.rb:332:in `_create_record'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/timestamp.rb:111:in `_create_record'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/persistence.rb:906:in `create_or_update'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/callbacks.rb:328:in `block in create_or_update'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.0/lib/active_support/callbacks.rb:135:in `run_callbacks'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.0/lib/active_support/callbacks.rb:827:in `_run_save_callbacks'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/callbacks.rb:328:in `create_or_update'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/timestamp.rb:129:in `create_or_update'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/persistence.rb:470:in `save'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/validations.rb:47:in `save'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/transactions.rb:315:in `block in save'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/transactions.rb:375:in `block in with_transaction_returning_status'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/abstract/database_statements.rb:275:in `transaction'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/transactions.rb:212:in `transaction'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/transactions.rb:366:in `with_transaction_returning_status'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/transactions.rb:315:in `save'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/suppressor.rb:44:in `save'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/persistence.rb:38:in `create'
/var/www/discourse/lib/discourse_tagging.rb:62:in `block in tag_topic_by_names'
/var/www/discourse/lib/discourse_tagging.rb:60:in `each'
/var/www/discourse/lib/discourse_tagging.rb:60:in `tag_topic_by_names'
/var/www/discourse/lib/topic_creator.rb:158:in `setup_tags'
/var/www/discourse/lib/topic_creator.rb:37:in `create'
/var/www/discourse/lib/post_creator.rb:421:in `create_topic'
/var/www/discourse/lib/post_creator.rb:168:in `block in create'
/var/www/discourse/lib/post_creator.rb:345:in `block in transaction'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/abstract/database_statements.rb:275:in `transaction'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/transactions.rb:212:in `transaction'
/var/www/discourse/lib/post_creator.rb:344:in `transaction'
/var/www/discourse/lib/post_creator.rb:166:in `create'
/var/www/discourse/app/models/reviewable_queued_post.rb:80:in `perform_approve_post'
/var/www/discourse/app/models/reviewable.rb:319:in `public_send'
/var/www/discourse/app/models/reviewable.rb:319:in `block in perform'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/abstract/database_statements.rb:277:in `block in transaction'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/abstract/transaction.rb:280:in `block in within_new_transaction'
/usr/local/lib/ruby/2.6.0/monitor.rb:235:in `mon_synchronize'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/abstract/transaction.rb:278:in `within_new_transaction'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/connection_adapters/abstract/database_statements.rb:277:in `transaction'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/transactions.rb:212:in `transaction'
/var/www/discourse/app/models/reviewable.rb:317:in `perform'
/var/www/discourse/app/controllers/reviewables_controller.rb:184:in `perform'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/abstract_controller/base.rb:196:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_controller/metal/rendering.rb:30:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/abstract_controller/callbacks.rb:42:in `block in process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.0/lib/active_support/callbacks.rb:135:in `run_callbacks'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/abstract_controller/callbacks.rb:41:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_controller/metal/rescue.rb:22:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_controller/metal/instrumentation.rb:33:in `block in process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.0/lib/active_support/notifications.rb:180:in `block in instrument'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.0/lib/active_support/notifications/instrumenter.rb:24:in `instrument'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.0/lib/active_support/notifications.rb:180:in `instrument'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_controller/metal/instrumentation.rb:32:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_controller/metal/params_wrapper.rb:245:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.0/lib/active_record/railties/controller_runtime.rb:27:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/abstract_controller/base.rb:136:in `process'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionview-6.0.0/lib/action_view/rendering.rb:39:in `process'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-1.1.0/lib/mini_profiler/profiling_methods.rb:104:in `block in profile_method'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_controller/metal.rb:191:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_controller/metal.rb:252:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_dispatch/routing/route_set.rb:51:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_dispatch/routing/route_set.rb:33:in `serve'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_dispatch/journey/router.rb:49:in `block in serve'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_dispatch/journey/router.rb:32:in `each'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_dispatch/journey/router.rb:32:in `serve'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_dispatch/routing/route_set.rb:837:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-protection-2.0.7/lib/rack/protection/frame_options.rb:31:in `call'
/var/www/discourse/lib/middleware/omniauth_bypass_middleware.rb:68:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/tempfile_reaper.rb:15:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/conditional_get.rb:38:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/head.rb:12:in `call'
/var/www/discourse/lib/content_security_policy/middleware.rb:12:in `call'
/var/www/discourse/lib/middleware/anonymous_cache.rb:274:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/session/abstract/id.rb:232:in `context'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/session/abstract/id.rb:226:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_dispatch/middleware/cookies.rb:648:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_dispatch/middleware/callbacks.rb:27:in `block in call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.0/lib/active_support/callbacks.rb:101:in `run_callbacks'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_dispatch/middleware/callbacks.rb:26:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_dispatch/middleware/actionable_exceptions.rb:17:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_dispatch/middleware/debug_exceptions.rb:32:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/logster-2.3.3/lib/logster/middleware/reporter.rb:43:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.0/lib/rails/rack/logger.rb:38:in `call_app'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.0/lib/rails/rack/logger.rb:28:in `call'
/var/www/discourse/config/initializers/100-quiet_logger.rb:18:in `call'
/var/www/discourse/config/initializers/100-silence_logger.rb:31:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_dispatch/middleware/remote_ip.rb:81:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_dispatch/middleware/request_id.rb:27:in `call'
/var/www/discourse/lib/middleware/enforce_hostname.rb:17:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/method_override.rb:22:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_dispatch/middleware/executor.rb:14:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/sendfile.rb:111:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.0/lib/action_dispatch/middleware/host_authorization.rb:77:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-1.1.0/lib/mini_profiler/profiler.rb:296:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/message_bus-2.2.2/lib/message_bus/rack/middleware.rb:57:in `call'
/var/www/discourse/lib/middleware/request_tracker.rb:176:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.0/lib/rails/engine.rb:526:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.0/lib/rails/railtie.rb:190:in `public_send'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.0/lib/rails/railtie.rb:190:in `method_missing'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/urlmap.rb:68:in `block in call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/urlmap.rb:53:in `each'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/urlmap.rb:53:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/lib/unicorn/http_server.rb:605:in `process_client'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/lib/unicorn/http_server.rb:700:in `worker_loop'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/lib/unicorn/http_server.rb:548:in `spawn_missing_workers'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/lib/unicorn/http_server.rb:144:in `start'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/bin/unicorn:128:in `<top (required)>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/bin/unicorn:23:in `load'
/var/www/discourse/vendor/bundle/ruby/2.6.0/bin/unicorn:23:in `<main>'

Any idea why it’s happening? It seems to be trying to create a tag that already exists?

Update:

On one of the tags where we were getting the same problem, we ended up simply asking the user to repost without the tag, then upon editing it I was able to add the tag (and also visit the tag’s page without issue). Previously the user was actually able to post the topic but it had gone into the review queue (as we review all first posts/topics) and we were getting the internal server error when trying to authorise the topic.

However, I’m not able to add the other tag that it happened to (ecommerce) as it is still reporting an internal server error.

J’obtiens la même chose sur un autre tag :

ActiveRecord::RecordNotUnique (PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_tags_on_name"
DETAIL:  Key (name)=(file-uploading) already exists.
)
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-1.1.2/lib/patches/db/pg.rb:72:in `async_exec_params'

Est-ce un bug de Discourse ou d’AR/Rails ? Il semble qu’il tente de créer le tag à nouveau alors qu’il existe déjà ?

Pouvez-vous regarder dans l’explorateur de données, dans la table des tags, peut-être y a-t-il un problème de casse entre Ecommerce et ecommerce ?

1 « J'aime »

Salut Sam, j’ai regardé dans le tableau et il y a :

ecommerce
e-commerce

Avec le deuxième (file-uploading), il y a :

file-downloading
file-uploading

Ils ont tous les deux des traits d’union, alors je me demande si c’est la cause du problème ?

Dans les paramètres, nous avons coché « forcer les balises en minuscules » — est-ce que cela pourrait aussi entrer en conflit d’une manière ou d’une autre ?

Si tu as besoin que je vérifie autre chose, fais-le-moi savoir :blush:

Pas sûr à 100 %, attendez un jour ou deux, @neil connaît très bien le système de balises, il pourrait avoir quelques idées là-dessus.

1 « J'aime »

Je m’en occupe, merci Sam :smiley:

J’ai testé des noms de balises en casse mixte et des balises contenant des tirets, mais je n’arrive pas à reproduire cette erreur. Quelle version exacte de Discourse utilisez-vous ? Cela se produit-il dans une catégorie avec des restrictions de balises ? Quels autres paramètres de balises utilisez-vous ?

2 « J'aime »

Salut Neil, j’utilise la version 2.4.0.beta6 (8ca5aad1e2)

J’ai réussi à résoudre le problème en renommant manuellement les éléments dans la console Rails — curieusement, le tag e.commerce renvoyait nil alors qu’il existait ! Je l’ai localisé par son ID, puis je l’ai renommé, et tout fonctionne désormais.

J’ai l’impression que cela a commencé lorsque la sensibilité à la casse a été introduite (nous rencontrons ce problème depuis un moment, mais j’attends généralement quelques nouvelles versions, car vous corrigez généralement les choses assez rapidement).

Si vous avez besoin que j’enquête sur autre chose, faites-le-moi savoir. Sinon, je passerai en revue tous les tags (ou les journaux d’erreurs) pour identifier d’autres tags défectueux et les corriger en conséquence. Au cas où cela pourrait aider, voici les réponses à vos questions :

Non — mais toutes les catégories exigent au moins un tag.

1 « J'aime »

Je ne comprends pas quel était le problème. Vous avez renommé « e.commerce » de quoi à quoi ? J’ai testé l’activation et la désactivation du paramètre forcer les balises en minuscules, en utilisant des balises en casse mixte, et cela n’a pas tenté de créer des balises en double.

3 « J'aime »

J’ai renommé tag-name en tag-name2, puis à nouveau en tag-name.

J’ai utilisé la recherche par nom pour les localiser :

Tag.find_by name: "tag-name"

Cependant, cela n’a pas fonctionné pour e-commerce. J’ai dû le trouver par son ID, ce qui semble étrange — je ne sais pas pourquoi cela s’est produit.

La seule autre chose à laquelle je peux penser, c’est qu’à un moment donné, j’ai étiqueté en masse des fils en effectuant une recherche, puis en cliquant sur plusieurs sujets et en sélectionnant « ajouter un tag » dans les options. Je ne sais pas si cela ferait une différence, though : /

Désolé @neil, j’ai rencontré un autre problème qui pourrait être lié.

Deux tags avec le même nom, mais ma correction manuelle ne fonctionne pas cette fois.

[1] pry(main)> Tag.find_by(name: "liveview")
=> #<Tag:0x000055646b510750
 id: 1843,
 name: "liveview",
 topic_count: 25,
 created_at: Tue, 01 Oct 2019 07:42:44 UTC +00:00,
 updated_at: Tue, 01 Oct 2019 07:42:44 UTC +00:00,
 pm_topic_count: 0>
[2] pry(main)> t=Tag.find_by(id: 1036)
=> #<Tag:0x000055646b653978
 id: 1036,
 name: "liveview",
 topic_count: 150,
 created_at: Sun, 09 Sep 2018 16:19:15 UTC +00:00,
 updated_at: Sun, 09 Sep 2018 16:19:15 UTC +00:00,
 pm_topic_count: 0>
[3] pry(main)> t2=Tag.find_by(id: 1843)
=> #<Tag:0x000055646b6af7a0
 id: 1843,
 name: "liveview",
 topic_count: 25,
 created_at: Tue, 01 Oct 2019 07:42:44 UTC +00:00,
 updated_at: Tue, 01 Oct 2019 07:42:44 UTC +00:00,
 pm_topic_count: 0>
[4] pry(main)> t2.name = "liveview2"
=> "liveview2"
[5] pry(main)> t2.save
=> true
[6] pry(main)> t.name = "liveview1"
=> "liveview1"
[7] pry(main)> t.save
=> true
[8] pry(main)> t.name = "liveview"
=> "liveview"
[9] pry(main)> t.save
=> true
[10] pry(main)> t.name = "liveview1"
=> "liveview1"
[11] pry(main)> 

liveview2 fonctionne, mais le seul liveview ne fonctionne pas, alors qu’il fonctionne lorsqu’il est nommé liveview1, mais lorsque son nom est à nouveau changé en liveview, cela affiche simplement « Oops ! Cette page n’existe pas ou est privée. ». Est-ce lié à l’index ?

(rien non plus dans /logs)

Il existe deux index pour protéger contre ce cas. Votre base de données manque-t-elle de ces index ?

$ bin/rails db

discourse_development=# \d tags
                                          Table "public.tags"
     Column     |            Type             | Collation | Nullable |             Default              
----------------+-----------------------------+-----------+----------+----------------------------------
 id             | integer                     |           | not null | nextval('tags_id_seq'::regclass)
 name           | character varying           |           | not null | 
 topic_count    | integer                     |           | not null | 0
 created_at     | timestamp without time zone |           | not null | 
 updated_at     | timestamp without time zone |           | not null | 
 pm_topic_count | integer                     |           | not null | 0
Indexes:
    "tags_pkey" PRIMARY KEY, btree (id)
    "index_tags_on_lower_name" UNIQUE, btree (lower(name::text))
    "index_tags_on_name" UNIQUE, btree (name)

Une migration datée du 28 septembre 2018 aurait dû corriger les balises avec des noms en double, puis créer l’un des index. Avez-vous importé votre site depuis un autre logiciel de forum ? Si c’est le cas, cela aurait pu créer des lignes en double et ensuite échouer à créer les index.

1 « J'aime »
     Colonne     |            Type             | Collation | Nullable |             Valeur par défaut              
----------------+-----------------------------+-----------+----------+----------------------------------
 id             | integer                     |           | not null | nextval('tags_id_seq'::regclass)
 name           | character varying           |           | not null | 
 topic_count    | integer                     |           | not null | 0
 created_at     | timestamp without time zone |           |          | 
 updated_at     | timestamp without time zone |           |          | 
 pm_topic_count | integer                     |           | not null | 0
Indexes:
    "tags_pkey" PRIMARY KEY, btree (id)
    "index_tags_on_lower_name" UNIQUE, btree (lower(name::text))
    "index_tags_on_name" UNIQUE, btree (name)

Non, il s’agit toujours d’un forum Discourse. La seule chose que j’ai faite est de le déplacer vers un autre serveur, ce qui a nécessité une nouvelle installation suivie d’une importation via une sauvegarde. Je pense que cela a été fait vers août de l’année dernière — cela pourrait-il en être la cause ?

Devrais-je exécuter une commande comme REINDEX TABLE tags; pour reconstruire les index, Neil ?

Édit : je viens de remarquer que created_at et updated_at n’ont pas la mention not null dans la colonne nullable — cela aura-t-il de l’importance ?

Édit 2 : Je viens de remarquer qu’il y a deux de ces tags :

1862	live-view
1486	live-view

Oui, je pense que le réindexage de la table est nécessaire. Mais avant cela, vous devrez renommer les balises ayant des noms en double, sinon le réindexage échouera. Espérons que seule la table des balises rencontre ce problème…

Je ne vois pas comment une restauration pourrait créer ce problème. Les index sont présents, mais ils ne fonctionnent manifestement pas.

2 « J'aime »

C’est fait :smiley:

Si quelqu’un d’autre a besoin de la requête pour trouver les tags en double, la voici :

SELECT name, COUNT(*)
FROM tags
GROUP BY name
HAVING COUNT(*) > 1

Ne m’effraie pas comme ça, Neil ! :scream:

J’ai jeté un coup d’œil rapide à la table des catégories et elle semble correcte (il y a quelques entrées en double basées sur le nom, mais ce sont des sous-catégories).

Merci pour votre aide @sam et @neil :blush:

(La réindexation n’a eu aucun effet sur ce problème, par contre, Neil)

Nous avons cet index :

Êtes-vous absolument certain qu’il existe dans la table ? Car ce que vous décrivez impliquerait un Postgres complètement cassé, ce qui est infiniment improbable et provoquerait des ondes de choc dans toute la communauté.

Il est beaucoup plus probable que cet index ait été supprimé à un moment donné à cause d’une erreur humaine…

À tout le moins, je vous recommande d’exécuter create unique index on tags (name), mais qu’avez-vous d’autre de manquant ?

3 « J'aime »

Bonjour Sam,

J’ai :

discourse=> \d tags
                                          Table "public.tags"
     Column     |            Type             | Collation | Nullable |             Default              
----------------+-----------------------------+-----------+----------+----------------------------------
 id             | integer                     |           | not null | nextval('tags_id_seq'::regclass)
 name           | character varying           |           | not null | 
 topic_count    | integer                     |           | not null | 0
 created_at     | timestamp without time zone |           |          | 
 updated_at     | timestamp without time zone |           |          | 
 pm_topic_count | integer                     |           | not null | 0
Indexes:
    "tags_pkey" PRIMARY KEY, btree (id)
    "index_tags_on_lower_name" UNIQUE, btree (lower(name::text))
    "index_tags_on_name" UNIQUE, btree (name)

Et pour recréer les index, j’ai…

  • renommé les tags en double (donc tag_name_1 et tag_name_2, etc.)
  • vérifié qu’il ne restait plus de tags en double avec la requête du message ci-dessus
  • accédé à rails db puis exécuté :
discourse=> REINDEX TABLE tags;
REINDEX

Dois-je faire autre chose que cela, Sam ?

Essayez peut-être d’insérer un tag de doublon et vérifiez que votre index est conforme et n’autorise plus les données en double.

1 « J'aime »

Ça a l’air bon Sam :

[1] pry(main)> t=Tag.new
=> #<Tag:0x000055fe76499830 id: nil, name: nil, topic_count: 0, created_at: nil, updated_at: nil, pm_topic_count: 0>
[2] pry(main)> t
=> #<Tag:0x000055fe76499830 id: nil, name: nil, topic_count: 0, created_at: nil, updated_at: nil, pm_topic_count: 0>
[3] pry(main)> t.name ="test-five"
=> "test-five"
[4] pry(main)> t.save
=> true

[5] pry(main)> Tag.last
=> #<Tag:0x000055fe7671ce90
 id: 1995,
 name: "test-five",
 topic_count: 0,
 created_at: Fri, 08 Nov 2019 02:44:36 UTC +00:00,
 updated_at: Fri, 08 Nov 2019 02:44:36 UTC +00:00,
 pm_topic_count: 0

[6] pry(main)> t=Tag.new
=> #<Tag:0x000055fe76763a70 id: nil, name: nil, topic_count: 0, created_at: nil, updated_at: nil, pm_topic_count: 0>
[7] pry(main)> t.name ="test-five"
=> "test-five"
[8] pry(main)> t.save
=> false
[9] pry(main)> 

J’ai aussi essayé via le forum dans un sujet :

Si tu penses que je devrais essayer autre chose, fais-le-moi savoir :smiley:

1 « J'aime »

Pour confirmer également, je ne pense pas avoir fait autre chose avec la base de données via la console, donc je ne sais pas pourquoi cela s’est produit. Je -pense- que cela a peut-être commencé après l’introduction de la sensibilité à la casse, mais je ne peux pas en être certain. Si vous avez besoin que je vérifie d’autres éléments pour aider à identifier la cause racine du problème, faites-le-moi savoir, Sam.