etalab / transport-site

Rendre disponible, valoriser et améliorer les données transports
https://transport.data.gouv.fr
184 stars 28 forks source link

WIP reproduction deadlock Postgres durant les tests #3994

Open thbar opened 2 weeks ago

thbar commented 2 weeks ago

Travail en cours avec @vdegove pour comprendre d'où vient le deadlock constaté.

On a la cause, on cherche ici à "zoomer" sur la plus petite reproduction possible.

thbar commented 1 week ago

Vu avec @vdegove, qui regarde pour rétrécir la repro, et je prendrai le relais derrière pour chercher un fix

vdegove commented 1 week ago

@thbar ok, donc j’ai le cas de reproduction minimal du deadlock, avec seulement 2 tests \o/

apps/transport/test/transport/stats_handler_test.exs
apps/transport/test/transport_web/controllers/dataset_search_test.exs

bingo

Lorsqu’on lance :

mix test --only focus

On obtient :

==> transport
Excluding tags: [:test, :pending, :transport_tools, :documentation_links]
Including tags: [:focus]

.....

  1) test compute aom max severity (Transport.StatsHandlerTest)
     apps/transport/test/transport/stats_handler_test.exs:126
     ** (Postgrex.Error) ERREUR 40P01 (deadlock_detected) interblocage (deadlock) détecté

         hint: Voir les journaux applicatifs du serveur pour les détails sur la requête.

     Le processus 1825993 attend AccessExclusiveLock sur relation 18279 de la base de données 16388 ; bloqué par le processus 1825995.
     Le processus 1825995 attend AccessExclusiveLock sur relation 17856 de la base de données 16388 ; bloqué par le processus 1825993.
     code: aom_1 = insert(:aom)
     stacktrace:
       (ecto_sql 3.11.1) lib/ecto/adapters/sql.ex:1054: Ecto.Adapters.SQL.raise_sql_call_error/1
       (ecto 3.11.2) lib/ecto/repo/schema.ex:775: Ecto.Repo.Schema.apply/4
       (ecto 3.11.2) lib/ecto/repo/schema.ex:377: anonymous fn/15 in Ecto.Repo.Schema.do_insert/4
       (ecto 3.11.2) lib/ecto/association.ex:1279: Ecto.Association.BelongsTo.on_repo_change/5
       (ecto 3.11.2) lib/ecto/association.ex:624: Ecto.Association.on_repo_change/7
       (elixir 1.16.2) lib/enum.ex:2528: Enum."-reduce/3-lists^foldl/2-0-"/3
       (ecto 3.11.2) lib/ecto/association.ex:589: Ecto.Association.on_repo_change/4
       (ecto 3.11.2) lib/ecto/repo/schema.ex:922: Ecto.Repo.Schema.process_parents/6
       (ecto 3.11.2) lib/ecto/repo/schema.ex:351: anonymous fn/15 in Ecto.Repo.Schema.do_insert/4
       (ecto 3.11.2) lib/ecto/repo/schema.ex:1033: anonymous fn/3 in Ecto.Repo.Schema.wrap_in_transaction/6
       (ecto_sql 3.11.1) lib/ecto/adapters/sql.ex:1358: anonymous fn/3 in Ecto.Adapters.SQL.checkout_or_transaction/4
       (db_connection 2.6.0) lib/db_connection.ex:1710: DBConnection.run_transaction/4
       (ecto 3.11.2) lib/ecto/repo/schema.ex:273: Ecto.Repo.Schema.insert!/4
       test/transport/stats_handler_test.exs:127: (test)

 […]

...............
Finished in 7.9 seconds (7.9s async, 0.03s sync)
190 doctests, 981 tests, 4 failures, 1141 excluded

Randomized with seed 277802
vdegove commented 1 week ago

Un autre truc remarqué : si je retire uniquement les deux tests suivants, tout marche :

        modifié :         apps/transport/test/transport/consolidated_dataset_test.exs
        modifié :         apps/transport/test/transport/stats_handler_test.exs