← Journal technique
EduQate·intégrité des données

Un pooler de connexions qui corrompait des données

pgBouncer transaction pooling reuses one connection across client sessions, so a leftover search_path made queries read and write against the wrong Postgres schema. No error, wrong data.

Ça ne pouvait pas marcher

Une course, un ordre, une colonne pour deux choses. La forme l'excluait avant même l'exécution.

Celui-ci m'a dérangé. pgBouncer est entré parce que des connexions Postgres par requête n'allaient pas tenir sous charge, mais le transaction pooling réutilise la même connexion sous-jacente entre sessions client. Si une session définit search_path et que la suivante hérite de cette connexion sans la réinitialiser, les requêtes lisent et écrivent sur le mauvais schéma. Aucune erreur, aucun crash, juste de mauvaises données.

Ça a touché des données de seed avant que je comprenne ce qui se passait. J'ai corrigé les données, puis ajouté un job CI qui fait tourner toute la stack via Docker et martèle spécifiquement les requêtes à travers pgBouncer, parce que je ne veux pas redécouvrir une corruption de données silencieuse par accident.