I have the following code running on node “a”:
defmodule Devices.Teste do
use GenServer
def start_link() do
IO.inspect(["a", self()])
GenServer.start_link(__MODULE__, [], [])
end
def a(pid) do
IO.inspect(["b", self(), pid])
GenServer.call(pid, :a)
end
@impl true
def init([]) do
IO.inspect(["c", self()])
{:ok, []}
end
@impl true
def handle_call(:a, from, state) do
IO.inspect(["d", :a, self(), from])
Process.sleep(3000)
{:reply, :xyz, state}
end
@impl true
def handle_info(x, state) do
IO.inspect(["e", x, self()])
{:noreply, state}
end
end
From a node b, I call
{:ok, pid} = :erpc.call(:"a@192.168.15.83", Devices.Teste, :start_link, [])
then, the messages
["a", #PID<0.225.0>]
["c", #PID<0.226.0>]
are printed and the call returns
{:ok, #PID<20968.226.0>}
After that, I call
:erpc.call(:"a@192.168.15.83", Devices.Teste, :a, [pid])
then, the message
["b", #PID<0.227.0>, #PID<0.226.0>]
is printed, but I get the following error:
** (exit) {:exception, {:noproc, {GenServer, :call, [#PID<20968.226.0>, :a, 5000]}}}
(kernel 8.5.4) erpc.erl:700: :erpc.call/5
iex:2: (file)
If I call
GenServer.call(pid, :a)
no messages are printed and I get the following error
** (exit) exited in: GenServer.call(#PID<20968.214.0>, :a, 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.15.0) lib/gen_server.ex:1074: GenServer.call/3
iex:2: (file)
What am I missing?
As long as I understand, I should use the “remote” pid that I get from the start_link function.