eddy147
Sometimes getting :noproc error
Once in a while I get a :noproc error:
** (stop) exited in: GenServer.call({:via, Registry, {:trip_generation_server, "804194805327673"}}, :send_to_processing, 5000)
** (EXIT) no process: the process is not alive or there's no process currently associated with the given name, possibly because its application isn't started
(elixir 1.14.2) lib/gen_server.ex:1027: GenServer.call/3
(vehicle_processing 0.1.0) lib/vehicle_processing/processor.ex:1243: VehicleProcessing.Processor.run_trip_generation_server/3
(stdlib 4.2) gen_server.erl:1161: :gen_server.try_terminate/3
(stdlib 4.2) gen_server.erl:1351: :gen_server.terminate/10
(stdlib 4.2) proc_lib.erl:240: :proc_lib.init_p_do_apply/3
Last message: :check_end_of_processing
State: %VehicleProcessing.Processor.State{vehicle: nil, unique_identifier: "804194805327673", data_start_at: nil, data_stop_at: nil, last_active_at: ~U[2023-10-30 10:30:47.181818Z], parking_notification_sent: false, driver_id: %{ibutton: nil, log: nil, permission: nil}, gps_based_properties: %{distance: nil, speed: nil, time: nil}, sent_vehicle_start_trigger?: false, at_least_one_non_heartbeat_message?: true, messages: [], timer: #Reference<0.3285835207.3288072193.194993>, geofences: [], previous_trip_point: nil, gps_reference: nil, previous_state_of_charge: nil, notifications_sent: %{battery_level_low: nil, battery_range_low: nil, battery_state_of_charge_low: nil}, gps_send: 1}
I start the TripGenerationServer dynamically:
defp run_trip_generation_server(state, f, tries) do
if tries > 0 do
case Registry.lookup(:trip_generation_server, state.unique_identifier) do
[] ->
case TripGenerationServerSupervisor.start_child(state.unique_identifier) do
{:ok, _pid} ->
f.(state)
e ->
Logger.warning(
"Can not start TripGenerationServer #{state.unique_identifier}: #{inspect(e)}"
)
Process.sleep(200)
run_trip_generation_server(state, f, tries - 1)
end
[{_pid, _nil}] ->
f.(state)
end
else
Logger.error("Can not startTripGenerationServer #{state.unique_identifier}")
end
state
end
And I get the :noproc error when
[{_pid, _nil}] ->
f.(state)
defmodule VehicleProcessing.TripGenerationServerSupervisor do
@moduledoc false
use DynamicSupervisor
require Logger
alias VehicleProcessing.TripGenerationServer
def start_link(_) do
Logger.info("start #{__MODULE__}")
DynamicSupervisor.start_link(__MODULE__, [], name: __MODULE__)
end
def start_child(unique_identifier) do
child_spec = %{
id: TripGenerationServer,
start: {TripGenerationServer, :start, [unique_identifier]},
# the child process is restarted only if it terminates abnormally,
# i.e., with an exit reason other than :normal, :shutdown, or {:shutdown, term}
restart: :transient,
shutdown: :brutal_kill,
type: :worker,
modules: [TripGenerationServer]
}
DynamicSupervisor.start_child(__MODULE__, child_spec)
end
@impl true
def init([]) do
DynamicSupervisor.init(strategy: :one_for_one)
end
end
How is this possible?
It also happens sometimes in a test, and when I run the test again, the error does not appear; or it appears in another test, totally random.
Marked As Solved
al2o3cr
One thought: TripGenerationServerSupervisor.start_child will return the child PID as soon as the process is started, but a call using a via tuple won’t succeed until the child process has registered (presumably using code in TripGenerationServer)
The error you’re seeing could happen if the callback passed to run_trip_generation_server “wins the race” and tries to make a call too early.
Also Liked
dimitarvp
Oh, don’t do that. I am not sure that’s your problem but always do these with handle_continue!
Also a piece from handle_call docs:
Returning
{:reply, reply, new_state, {:continue, continue_arg}}is similar to{:reply, reply, new_state}except thathandle_continue/2will be invoked immediately after withcontinue_argas the first argument andstateas the second one.
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
- #javascript
- #code-sync
- #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








