This is driving me nuts. I know it's something simple. I just can't see it.
I've got two nodes running on the same machine. They have a shared cookie. I can net_adm:ping/1 both ways.
Here is the code from the gen_server I'm trying to access. I've left out the comments and the -spec lines.
-module(back_server).
-behaviour(gen_server).
-export([start/0,start/3,stop/0,setState/1,getState/0]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
start() ->
gen_server:start_link({global, ?MODULE}, ?MODULE, [], []).
start(Registration_type,Name,Args) ->
gen_server:start_link({Registration_type, Name}, ?MODULE, Args, []).
stop() -> gen_server:call(?MODULE, stop).
setState(NewState)->
io:format("setState called~n"),
gen_server:cast(?MODULE,{update,NewState}).
getState()->
io:format("getState called~n"),
gen_server:call(?MODULE,get).
init([]) ->
{ok,started}.
handle_call(get, _From, State) ->
{reply,State,State};
handle_call(stop, _From, _State) ->
{stop,normal,
stopped,
down}.
handle_cast({update,Value}, State) ->
io:format("changing state from ~p to ~p~n",[State,Value]),
{noreply,Value};
handle_cast(_Msg, State) ->
{noreply, State}.
handle_info(_Info, State) ->
{noreply, State}.
terminate(_Reason, _State) ->
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
This code runs on the back@ node. I'm using rebar3 and a supervisor to start it up. No errors on startup.
I see the registered name, back_server, for the server when I use global:registered_names/0 from front@.
When I call erpc:call('back@<ip>',back_server,getState,[]).
I get the following error.
getState called
** exception exit: {exception,{noproc,{gen_server,call,[back_server,get]}}}
in function erpc:call/5 (erpc.erl, line 503)
I know this will be a forehead slapper, duh experience. I just don't have anyone else to look at this with me.
Thanks.
This happens because a call like
gen_server:call(?MODULE,get)
looks for a process that's locally registered as?MODULE
, but your server process is globally registered as?MODULE
. So change thegetState
function to:(That also means that you don't need
erpc
- if theback_server
module is loaded on thefront@
node, you can just callback_server:getState()
directly, and it will send the request to the globally registered process on the other node.)