mlh758
Reacting to client disconnect
If I have a long running http request, say a search in an admin UI or a report on an analytics dashboard and the user takes an action on the front end that makes that request stale I would abort it with an AbortSignal. This immediately terminates the request from the client’s perspective. If I have this code in C# as an example:
[HttpGet]
public async Task<string> Timeout(CancellationToken abort, int seconds)
{
var tokenSource = CancellationTokenSource.CreateLinkedTokenSource(abort);
var duration = new SqlParameter("duration", $"00:00:{seconds:00}");
tokenSource.CancelAfter(2000);
await _context.Users.FromSqlRaw($"WAITFOR DELAY @duration;select * from AspNetUsers", duration).ToListAsync(tokenSource.Token);
return "Done";
}
And I execute this in the browser:
fetch('https://localhost:7117/api/registration?seconds=2', { signal: AbortSignal.timeout(100)})
The C# code immediately aborts through the token, raising a System.Threading.Tasks.TaskCanceledException that the controller can handle and clean up with. Go does something very similar through a Context value in the request which can be forwarded to the SQL interface and used to abort queries immediately.
A similar function in Phoenix:
def index(conn, %{"seconds" => seconds}) do
seconds = String.to_integer(seconds)
query = "SELECT pg_sleep($1)"
params = [seconds]
t = Task.async(fn ->
SQL.query(Timeouts.Repo, query, params)
end)
case Task.yield(t, 2_000) do
{:ok, {:ok, _result}} ->
send_resp(conn, 200, "Slept for #{seconds} seconds")
{:ok, {:error, _reason}} ->
send_resp(conn, 500, "Failed to execute sleep query")
nil ->
send_resp(conn, 503, "Failed to complete in time")
end
end
This handles timeouts nicely, and I can see the query being aborted and cleaned up in the logs. This is 80% of what I want so I’m already pretty happy. However if I send the query with the abort signal it still runs up until the server’s timeout. Does anything in Plug or Bandit signal the client hanging up in a similar way as the C# example? There are a few places in my app where I would like to release resources sooner if possible.
First Post!
shuiRong
I have the same need. After searching in multiple places, it seems that there isn’t any ready-made solution available.
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance









