gip-inclusion / rdv-insertion

Application permettant de fluidifier le parcours d’accompagnement social et professionnel sur les territoires
https://www.rdv-insertion.fr
13 stars 2 forks source link

[Bug] Duplicate keys dans sentry (applicant/orga et applicant/agent) #1006

Open Holist opened 1 year ago

Holist commented 1 year ago

Comportement observé

Nous avons de temps en temps des remontées d'erreurs dans sentry pour des violations de contraintes d'unicité suite à des webhooks reçus de rdv-s :

UserProfile / Created ReferentAssignation / Created

https://sentry.incubateur.net/organizations/betagouv/issues/24303/?project=16&query=is%3Aunresolved&statsPeriod=24h https://sentry.incubateur.net/organizations/betagouv/issues/31712/?project=16&query=is%3Aunresolved&statsPeriod=24h

ERROR: duplicate key value violates unique constraint "index_applicants_orgas_on_orga_id_and_applicant_id" (PG::UniqueViolation)

ERROR: duplicate key value violates unique constraint "index_agents_applicants_on_applicant_id_and_agent_id" (PG::UniqueViolation)

Comportement souhaité

Il s'agirait d'enquêter pour comprendre pourquoi sentry remonte ces alertes afin de gérer ces cas pour ne plus avoir cette erreur dans nos logs. J'ai regardé dans le sentry de RDV-S et je ne retrouve pas ces erreurs.

Holist commented 1 year ago

Une précédente pr pour tenter de résoudre ce problème avait été faite par @aminedhobb ici : https://github.com/betagouv/rdv-insertion/pull/941

Holist commented 1 year ago

@aminedhobb Nous avons 2 containers pour les jobs dans scalingo. Sont ils indispensables au bon fonctionnement de la production ? Je me disais que ça pourrait être intéréssant de tester avec un seul container pendant une semaine par exemple afin de voir si ces erreurs persistent ou pas. Si ces erreurs n'apparaissent plus il pourrait s'agir d'un problème de thread avec nos 2 containers jobs. Dans le cas de l'assignation des référents on utilise with_advisory_lock dans le code , cela devrait normalement nous éviter ce problème de thread mais je sèche un peu et je n'arrive pas à reproduire en local.

Holist commented 1 year ago

On pourrait aussi tester avec l'option transaction: true de with_advisory_lock pour voir si cela change quelquechose.

      Applicant.with_advisory_lock("assigning_#{rdv_solidarites_agent_id}_to_#{rdv_solidarites_user_id}", transaction: true) do
        attach_agent_to_applicant if event == "created"
        remove_agent_from_applicant if event == "destroyed"
      end
aminedhobb commented 1 year ago

On pourrait aussi tester avec l'option transaction: true de with_advisory_lock pour voir si cela change quelquechose.

      Applicant.with_advisory_lock("assigning_#{rdv_solidarites_agent_id}_to_#{rdv_solidarites_user_id}", transaction: true) do
        attach_agent_to_applicant if event == "created"
        remove_agent_from_applicant if event == "destroyed"
      end

La transaction étant synchrone je sais pas si ça change quelque chose si ?

Holist commented 1 year ago

La transaction étant synchrone je sais pas si ça change quelque chose si ?

Tu as raison. Normalement advisory_lock aurait du suffire mais je ne vois vraiment pas d'ou vient ce problème...