Hi guys,
I would like to know if anybody could help me.
I have a genserver that calls a TaskSupervisor to start tasks like this:
task =
Task.Supervisor.async_nolink(
UiccProvisioningsSupervisor,
fn -> Toto.bar() end
)
Process.send_after(self(), {:kill, task}, state.task_timeout)
and a handle_info like this:
def handle_info({:kill, task}, %{tasks: tasks} = state) do
if tasks[task.ref] do
Task.shutdown(task, :brutal_kill)
Toto.call_to_db()
{:noreply, %{state | tasks: Map.delete(tasks, task.ref)}}
else
{:noreply, state}
end
The toto.foo contains a transaction like this:
def foo(params) do
Repo.transaction(fn ->
ota_request = Repo.insert!(%Foo{} |> Foo.create_changeset(params))
Process.sleep(150)
end)
end
In this case , I got in the terminate callback of the Genserver:
scheduler terminated: {{:shutdown,
%DBConnection.ConnectionError{
message: "client #PID<0.698.0> exited",
reason: :error,
severity: :error
}},
{DBConnection.Holder, :checkout,
[
#PID<0.682.0>,
[
log: #Function<13.1473765/1 in Ecto.Adapters.SQL.with_log/3>,
source: "uicc_provisionings",
cast_params: [nil, nil, ~N[2023-06-22 11:12:24], "icc_id_3529"],
repo: SimManager.Repo,
timeout: 15000,
pool: DBConnection.Ownership,
pool_size: 10
]
]}}
I found that the task is the exited client. And the problem disappears when I remove the transaction.