Creando nuevo usuario error después de actualizar PG::UniqueViolation Clave Duplicada

Estoy ejecutando desde mi sitio desde mi servidor de desarrollo local, conectándome a un servidor de staging en vivo donde está alojado Discourse.

Estoy usando discourse_api.

Puedo ejecutar el comando client.sync_sso desde la terminal de mi Mac y creará un usuario en el foro sin ningún error. Pero genera un error si el comando proviene de mi servidor de desarrollo, a pesar de que se está pasando exactamente la misma información, lo que me confunde.

La API debería crear el usuario si no existe, pero los foros están generando un error de clave duplicada.

Failed to create or lookup user: PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "user_emails_pkey"
DETAIL:  Key (id)=(14) already exists.
.    add_groups: 
admin: 
moderator: 
avatar_force_update: true
avatar_url: /images/missing_profile.png
bio: 
card_background_url: 
confirmed_2fa: 
email: 231447@test.com
external_id: 350942
groups: 
locale: 
locale_force_update: 
location: 
logout: 
name: 
no_2fa_methods: 
nonce: xxxxxxxxxxxx
profile_background_url: 
remove_groups: 
require_2fa: 
require_activation: 
return_sso_url: https://xxxx.com/session/sso_login
suppress_welcome_message: 
title: 
username: 
website:     /var/www/discourse/vendor/bundle/ruby/3.1.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/pg.rb:69:in `exec_params'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/pg.rb:69:in `exec_params'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activerecord-7.0.4/lib/active_record/connection_adapters/postgresql_adapter.rb:768:in `block (2 levels) in exec_no_cache'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activesupport-7.0.4/lib/active_support/concurrency/share_lock.rb:187:in `yield_shares'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activesupport-7.0.4/lib/active_support/dependencies/interlock.rb:41:in `permit_concurrent_loads'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activerecord-7.0.4/lib/active_record/connection_adapters/postgresql_adapter.rb:767:in `block in exec_no_cache'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activesupport-7.0.4/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/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/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `handle_interr...

Backtrace

/var/www/discourse/app/controllers/session_controller.rb:268:in `rescue in sso_login'
/var/www/discourse/app/controllers/session_controller.rb:160:in `sso_login'
actionpack-7.0.4/lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
actionpack-7.0.4/lib/abstract_controller/base.rb:215:in `process_action'
actionpack-7.0.4/lib/action_controller/metal/rendering.rb:53:in `process_action'
actionpack-7.0.4/lib/abstract_controller/callbacks.rb:234:in `block in process_action'
activesupport-7.0.4/lib/active_support/callbacks.rb:118:in `block in run_callbacks'
/var/www/discourse/app/controllers/application_controller.rb:414:in `block in with_resolved_locale'
i18n-1.12.0/lib/i18n.rb:322:in `with_locale'
/var/www/discourse/app/controllers/application_controller.rb:414:in `with_resolved_locale'
activesupport-7.0.4/lib/active_support/callbacks.rb:127:in `block in run_callbacks'
activesupport-7.0.4/lib/active_support/callbacks.rb:138:in `run_callbacks'
actionpack-7.0.4/lib/abstract_controller/callbacks.rb:233:in `process_action'
actionpack-7.0.4/lib/action_controller/metal/rescue.rb:22:in `process_action'
actionpack-7.0.4/lib/action_controller/metal/instrumentation.rb:67:in `block in process_action'
activesupport-7.0.4/lib/active_support/notifications.rb:206:in `block in instrument'
activesupport-7.0.4/lib/active_support/notifications/instrumenter.rb:24:in `instrument'
activesupport-7.0.4/lib/active_support/notifications.rb:206:in `instrument'
actionpack-7.0.4/lib/action_controller/metal/instrumentation.rb:66:in `process_action'
actionpack-7.0.4/lib/action_controller/metal/params_wrapper.rb:259:in `process_action'
activerecord-7.0.4/lib/active_record/railties/controller_runtime.rb:27:in `process_action'
actionpack-7.0.4/lib/abstract_controller/base.rb:151:in `process'
actionview-7.0.4/lib/action_view/rendering.rb:39:in `process'
rack-mini-profiler-3.0.0/lib/mini_profiler/profiling_methods.rb:85:in `block in profile_method'
actionpack-7.0.4/lib/action_controller/metal.rb:188:in `dispatch'
actionpack-7.0.4/lib/action_controller/metal.rb:251:in `dispatch'
actionpack-7.0.4/lib/action_dispatch/routing/route_set.rb:49:in `dispatch'
actionpack-7.0.4/lib/action_dispatch/routing/route_set.rb:32:in `serve'
actionpack-7.0.4/lib/action_dispatch/journey/router.rb:50:in `block in serve'
actionpack-7.0.4/lib/action_dispatch/journey/router.rb:32:in `each'
actionpack-7.0.4/lib/action_dispatch/journey/router.rb:32:in `serve'
actionpack-7.0.4/lib/action_dispatch/routing/route_set.rb:852:in `call'
/var/www/discourse/lib/middleware/omniauth_bypass_middleware.rb:74:in `call'
rack-2.2.6.2/lib/rack/tempfile_reaper.rb:15:in `call'
rack-2.2.6.2/lib/rack/conditional_get.rb:27:in `call'
rack-2.2.6.2/lib/rack/head.rb:12:in `call'
actionpack-7.0.4/lib/action_dispatch/http/permissions_policy.rb:38:in `call'
/var/www/discourse/lib/content_security_policy/middleware.rb:12:in `call'
/var/www/discourse/lib/middleware/anonymous_cache.rb:364:in `call'
rack-2.2.6.2/lib/rack/session/abstract/id.rb:266:in `context'
rack-2.2.6.2/lib/rack/session/abstract/id.rb:260:in `call'
actionpack-7.0.4/lib/action_dispatch/middleware/cookies.rb:696:in `call'
actionpack-7.0.4/lib/action_dispatch/middleware/callbacks.rb:27:in `block in call'
activesupport-7.0.4/lib/active_support/callbacks.rb:99:in `run_callbacks'
actionpack-7.0.4/lib/action_dispatch/middleware/callbacks.rb:26:in `call'
actionpack-7.0.4/lib/action_dispatch/middleware/debug_exceptions.rb:28:in `call'
actionpack-7.0.4/lib/action_dispatch/middleware/show_exceptions.rb:26:in `call'
logster-2.11.3/lib/logster/middleware/reporter.rb:43:in `call'
railties-7.0.4/lib/rails/rack/logger.rb:40:in `call_app'
railties-7.0.4/lib/rails/rack/logger.rb:27:in `call'
/var/www/discourse/config/initializers/100-quiet_logger.rb:20:in `call'
/var/www/discourse/config/initializers/100-silence_logger.rb:29:in `call'
actionpack-7.0.4/lib/action_dispatch/middleware/remote_ip.rb:93:in `call'
actionpack-7.0.4/lib/action_dispatch/middleware/request_id.rb:26:in `call'
/var/www/discourse/lib/middleware/enforce_hostname.rb:24:in `call'
rack-2.2.6.2/lib/rack/method_override.rb:24:in `call'
actionpack-7.0.4/lib/action_dispatch/middleware/executor.rb:14:in `call'
rack-2.2.6.2/lib/rack/sendfile.rb:110:in `call'
actionpack-7.0.4/lib/action_dispatch/middleware/host_authorization.rb:131:in `call'
rack-mini-profiler-3.0.0/lib/mini_profiler/profiler.rb:249:in `call'
message_bus-4.3.2/lib/message_bus/rack/middleware.rb:60:in `call'
/var/www/discourse/lib/middleware/request_tracker.rb:228:in `call'
railties-7.0.4/lib/rails/engine.rb:530:in `call'
railties-7.0.4/lib/rails/railtie.rb:226:in `public_send'
railties-7.0.4/lib/rails/railtie.rb:226:in `method_missing'
rack-2.2.6.2/lib/rack/urlmap.rb:74:in `block in call'
rack-2.2.6.2/lib/rack/urlmap.rb:58:in `each'
rack-2.2.6.2/lib/rack/urlmap.rb:58:in `call'
unicorn-6.1.0/lib/unicorn/http_server.rb:634:in `process_client'
unicorn-6.1.0/lib/unicorn/http_server.rb:739:in `worker_loop'
unicorn-6.1.0/lib/unicorn/http_server.rb:547:in `spawn_missing_workers'
unicorn-6.1.0/lib/unicorn/http_server.rb:143:in `start'
unicorn-6.1.0/bin/unicorn:128:in `<top (required)>'
/var/www/discourse/vendor/bundle/ruby/3.1.0/bin/unicorn:25:in `load'
/var/www/discourse/vendor/bundle/ruby/3.1.0/bin/unicorn:25:in `<main>'

Publicando la solución aquí para cualquiera que se encuentre con un problema similar

Actualicé nuestros foros de la v1.6 a la 3.1 utilizando una copia de seguridad y restauración en un nuevo servidor
Desde la actualización, los nuevos registros de usuarios dejaron de funcionar a través de discourse_api y SSO

El error fue un
PG::UniqueViolation: ERROR: la clave duplicada viola la restricción única “user_emails_pkey”
DETALLE: La clave (id)=(xx) ya existe.

Después de investigar un poco, inicié sesión en la instancia y accedí a postgres, específicamente a la tabla “user_emails

                                          Tabla "public.user_emails"
      Columna      |            Tipo             | Collation | Nullable |                 Default                 
-------------------+-----------------------------+-----------+----------+-----------------------------------------
 id                | integer                     |           | not null | nextval('user_emails_id_seq'::regclass)
 user_id           | integer                     |           | not null | 
 email             | character varying(513)      |           | not null | 
 primary           | boolean                     |           | not null | false
 created_at        | timestamp without time zone |           | not null | 
 updated_at        | timestamp without time zone |           | not null | 
 normalized_email  | character varying           |           |          | 
Índices:
    "user_emails_pkey" PRIMARY KEY, btree (id)
    "index_user_emails_on_email" UNIQUE, btree (lower(email::text))
    "index_user_emails_on_normalized_email" btree (lower(normalized_email::text))
    "index_user_emails_on_user_id" btree (user_id)
    "index_user_emails_on_user_id_and_primary" UNIQUE, btree (user_id, "primary") WHERE "primary"

La columna id tiene una “user_emails_id_seq” para seleccionar el próximo ID disponible a usar al insertar un nuevo usuario

Ejecuté SELECT MAX(id) FROM user_emails; que devolvió 237023
y luego SELECT nextval(‘user_emails_id_seq’); que devolvió 23

Así que la tabla estaba desfasada.

Para arreglar
SELECT setval(‘user_emails_id_seq’, (SELECT MAX(id) FROM user_emails)+1);

1 me gusta

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.