benonymus
Genserver.call with timeout doesn't end up with :timeout message
Hey there,
I created a small genserver and it works great but I want to add a timeout to a call, and to test it in the handle_call/3 I am doing Process.sleep/1 with a longer time then the timeout, but instead of getting a :timeout message to catch in handle_info/2 I am just getting an error that says:
** (exit) exited in: GenServer.call(Checksum.Checksum, :calculate, 50)
** (EXIT) time out
here is the call:
def calculate_checksum() do
GenServer.call(__MODULE__, :calculate, 50)
end
here is the handle:
@impl GenServer
def handle_call(:calculate, _, state) do
Process.sleep(60)
result = 0
{:reply, {:ok, result}, state}
end
this is where I would expect to catch the timeout:
@impl GenServer
def handle_info(:timeout, state) do
{:reply, {:error, :timeout}, state}
end
What am I missing? ![]()
Thanks
Marked As Solved
lud
You need to catch the exit properly: https://elixir-lang.org/getting-started/try-catch-and-rescue.html#exits
Also Liked
kokolegorille
It is not the same timeout. One is the client timeout, one is the server timeout.
Please note server handlers should also return timeout, even init.
kokolegorille
Here is an example…
@timeout 5 * 60 * 1_000
@impl GenServer
def handle_call(:get_state, _from, state), do: {:reply, state, state, @timeout}
# Timeout handler
@impl GenServer
def handle_info(:timeout, state), do: stop_and_clean(state, {:shutdown, :timeout})
stop and clean is a custom function…
amnu3387
When you do a call with a timeout this is the timeout the caller process will wait before it throws an exception. You need to rescue this exception at the call site.
The timeout in a gen_server (the one you can set in the callback of any handle) is an internal timeout that sets an amount of time the gen_server can be without receiving any message, which upon it elapsing triggers an internal message of :timeout that you can handle. This timeout is disabled whenever a message arrives in the gen_servers mailbox and needs to be set again if you wish it to trigger again.
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








