Ecto_SQL checkout error


My team and I are migrating away from Mariaex and Ecto 2 to Ecto 3 and myxql.

We have all the main changes done and everything is working as it should except for one thing, the prepare statement.

Our config.ex looks like this:

use Mix.Config

# Needed for ecto tasks that modify the db like migrate
# Since we'll never directly modify the replica db it doesn't need to be in here
config :db, ecto_repos: [Db.Repo]

config :db, :read_repo, Db.ReadOnlyRepo

config :db, Db.Repo,
  priv: "priv/repo",
  pool_size: 10,
  connect_timeout: 25000,
  loggers: [{ExJsonLogger.Ecto.Logger, :log, []}],
  prepare: :unnamed

config :db, Db.ReadOnlyRepo,
  priv: "priv/repo",
  pool_size: 10,
  connect_timeout: 25000,
  loggers: [{ExJsonLogger.Ecto.Logger, :log, []}],
  prepare: :unnamed

When I run the test we have, we get the following error:

** (EXIT from #PID<0.93.0>) an exception was raised:
    ** (DBConnection.ConnectionError) could not checkout the connection owned by #PID<0.93.0>. When using the sandbox, connections are shared, so this may imply another process is using a connection. Reason: connection not available and request was dropped from queue after 123ms. You can configure how long requests wait in the queue using :queue_target and :queue_interval. See DBConnection.start_link/2 for more information
        (ecto_sql) lib/ecto/adapters/sql.ex:751: Ecto.Adapters.SQL.raise_sql_call_error/1
        (ecto_sql) lib/ecto/adapters/sql.ex:684: Ecto.Adapters.SQL.execute/5
        (ecto) lib/ecto/repo/queryable.ex:229: Ecto.Repo.Queryable.execute/4
        (ecto) lib/ecto/repo/queryable.ex:17: Ecto.Repo.Queryable.all/3
        (ecto) lib/ecto/repo/preloader.ex:229: Ecto.Repo.Preloader.fetch_query/8
        (elixir) lib/task/supervised.ex:90: Task.Supervised.invoke_mfa/2
        (elixir) lib/task/supervised.ex:35: Task.Supervised.reply/5
        (stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3

When I remove the prepared statement in the config, everything works and passes.

I have checked the docs and we are doing shared mode like this:

  setup tags do

    :ok = Ecto.Adapters.SQL.Sandbox.checkout(Db.Repo)

    unless tags[:async] do
      Ecto.Adapters.SQL.Sandbox.mode(Db.Repo, {:shared, self()})

Any ideas?

1 Like