eddy147

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

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

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 that handle_continue/2 will be invoked immediately after with continue_arg as the first argument and state as the second one.

Where Next?

Popular in Questions Top

lessless
I believe there are people here who are dealing with CSV files import on the daily basis, and since Excel is a really popular tool there ...
New
jerry
Good day to you all. I have been struggling to get a query involving like and ilike to work. Can anyone assist me on this, please? pro...
New
sergio_101
I am VERY much an elixir newbie. I have taken one elixir course and one phoenix course on Udemy. During that course, I saw the instructor...
New
Kagamiiiii
Student &amp; New to elixir. Nice language. I want to convert a english character, e.g. “a”, which is stored in a variable, to it’s asci...
New
Phillipp
Hey, I have a NanoPi-M3 and try to install Elixir on their Ubuntu image. I followed the Raspberry Pi installation instructions from the ...
New
aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
belgoros
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers' Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
lucidguppy
I have a super simple question about elixir - how would I take a file like this foo bar baz and output a new file that enumerates th...
New
siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New

Other popular topics Top

JakeBecker
TL;DR: I’ve just released an implementation of Microsoft’s IDE-independent Language Server Protocol for Elixir. It adds language support ...
1140 51847 244
New
yawaramin
In the Dialyzer docs ( http://erlang.org/doc/man/dialyzer.html#requesting-or-suppressing-warnings-in-source-files ), there is a way to tu...
New
ycv005
I have followed this StackOverflow post to install the specific version of Erlang. And When I am running mix ecto.setup then getting fol...
New
jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod -- where is this set? Thanks.
New
mcarvalho
What is the difference between System.get_env and Application.get_env? For example, what are best practices to use one versus another.
New
aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
rms.mrcs
Hi, I need to transform a list of numbers into a map where the keys are the indexes and the values are the original values of the list....
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID&lt;0.412.0&gt; terminating ** (Postgrex.Error) FATAL...
New
lucidguppy
I have a super simple question about elixir - how would I take a file like this foo bar baz and output a new file that enumerates th...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New

We're in Beta

About us Mission Statement