Projet

Général

Profil

Bug #67454

ForeignKeyViolation: ERREUR: une instruction insert ou update sur la table « transient_data » viole la contrainte de clé

Ajouté par Sentry Io il y a presque 2 ans. Mis à jour il y a plus d'un an.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
18 juillet 2022
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

https://sentry.entrouvert.org/entrouvert/nfrance/issues/62567/

ForeignKeyViolation: ERREUR:  une instruction insert ou update sur la table « transient_data » viole la contrainte de clé
étrangère « transient_data_session_id_fkey »
DETAIL:  La clé (session_id)=(Hyd1B_ZwHA67DYqCNyBr2Q) n'est pas présente dans la table « sessions ».

(5 additional frame(s) were not displayed)
...
  File "wcs/qommon/sessions.py", line 398, in __setitem__
    session.store()
  File "wcs/sql.py", line 617, in f
    return func(*args, **kwargs)
  File "wcs/sql.py", line 3424, in store
    v.store()
  File "wcs/sql.py", line 617, in f
    return func(*args, **kwargs)
  File "wcs/sql.py", line 3372, in store
    cur.execute(sql_statement, sql_dict)

Fichiers

Révisions associées

Révision 5f40d72c (diff)
Ajouté par Lauréline Guérin il y a plus d'un an

sql: do not fail on transient_data store if session is not found (#67454)

Historique

#1

Mis à jour par Lauréline Guérin il y a presque 2 ans

  • Projet changé de Suivi des traces à w.c.s.
#3

Mis à jour par Lauréline Guérin il y a presque 2 ans

J'aurais bien aimé enchaîner deux ON CONFLICT dans l'instruction sql, mais ça n'a pas l'air permis.
Alors try/except :/

#4

Mis à jour par A. Berriot il y a presque 2 ans

  • Statut changé de Solution proposée à Solution validée
#5

Mis à jour par A. Berriot il y a presque 2 ans

(vu que ça a l'air d'être un edge case, ça me parait pas gravissime de gérer ça côté python avec un try/except plutôt que dans le SQL)

#6

Mis à jour par Lauréline Guérin il y a presque 2 ans

  • Statut changé de Solution validée à En cours

A reprendre avec IntegrityError pour être plus souple ? https://sentry.entrouvert.org/entrouvert/publik/issues/62630/

#7

Mis à jour par Benjamin Dauvergne il y a presque 2 ans

Je pense que le souci c'est les conn.commit() dans TransientData.store() sans ça la sauvegarde de la session se passerait dans une seule transaction, celle en cours quand Session.store() commence, là on se retrouve avec pleins de bouts de transactions et entre temps la session qui disparaît, au passage déplacer la sauvegarde des TransientData à la fin de Session.store(), le UPDATE/INSERT de la session va verrouiller la session.

J'ajouterai un paramètre commit=True à False dans Session.store().

Aussi on ne devrait pas automatiquement basculer de UPDATE vers INSERT, si la session n'est plus là alors qu'on a son id c'est qu'elle a été supprimée, il ne faut pas la ressusciter (si l'id est automatiquement généré par quixote et qu'on ne peut donc pas baser la logique sur sa présence, prévoir un flag session nouvelle/session chargée). Le code de Django est mieux réfléchi qu'ici. Ça donnera les erreurs qu'on voit coté Django de session qui ont disparu pendant le traitement d'une requête mais on pourra les traiter plus proprement que Django qui en fait tout une histoire.

#8

Mis à jour par Lauréline Guérin il y a plus d'un an

Le même patch avec IntegrityError

Je n'ose pas me lancer dans le chantier décrit par Benjamin.

#9

Mis à jour par Frédéric Péters il y a plus d'un an

  • Statut changé de Solution proposée à Solution validée

Oui très bien comme ça. (tu peux pousser dès jenkins ok, je comptais pousser #67843 et tagguer une nouvelle version).

#10

Mis à jour par Lauréline Guérin il y a plus d'un an

  • Statut changé de Solution validée à Résolu (à déployer)
commit 5f40d72c87f69ded10360418f952eb54604e8ad9
Author: Lauréline Guérin <zebuline@entrouvert.com>
Date:   Mon Jul 25 10:58:11 2022 +0200

    sql: do not fail on transient_data store if session is not found (#67454)
#11

Mis à jour par Transition automatique il y a plus d'un an

  • Statut changé de Résolu (à déployer) à Solution déployée
#12

Mis à jour par Transition automatique il y a plus d'un an

Automatic expiration

Formats disponibles : Atom PDF