Partitioned network solving

Vladimir Sekissov svg@REDACTED
Wed Mar 20 01:37:02 CET 2002


Good day,

I'm bother on partitioned network solving in my distributed
application. It seems that for global names conflict resolving later
registered processes are unregistered. So I register global process in
my application and use modified version of Ulf Wiger nodemon.erl
(# Message-Id: <200003091440.PAA02811@REDACTED>) and
code below on all application nodes, but I'm not sure that this solution
fully correct. Can somebody point me to possible troubles.

Another question - I don't use dist_auto_connect = once in config file
but when I have suspended one node with Ctrl-G from shell they don't
try to connect after and I need to ping one of them explicitly.

%%
%% nodemon_handler(FromNode, State) -> {Action, NewState}
%%    called by nodemon when network partitioning detected
%%       FromNode - node detected as partitioned
%%       State    - handler state
%%       Action   - stop | restart | reboot | nothing
%%       NewState - new handler state
%%
nodemon_handler(FromNode, State) -> 
  %% tac_master - application globally registered process
  case global:whereis_name(tac_master) of
    undefined ->
      ?LOG_ERROR("Partitioned network (~p,~p), no tac_master",
                [node(), FromNode]),
      {nothing, State};
    _ ->
      
      MasterNode = wait_name_resolve(FromNode),
      if MasterNode == node() ->
          %% we are master in low
          %% global has already unregistered process on backup node
          {nothing, State};
         %% we are syncing with master only
         MasterNode == FromNode ->
          mnesia:set_master_nodes([MasterNode]),
          {restart, State};
         %is not a master skip it
         true ->
          {nothing, State}
      end
  end.

wait_name_resolve(RemNode) ->
  OurVsn = node(global:whereis_name(tac_master)),
  RemVsn =
    case rpc:call(RemNode, global, whereis_name, [tac_master]) of
      {badrpc, _} ->
        OurVsn;
      RemPid ->
        rpc:call(RemNode, erlang, node, [RemPid])
    end,
  if OurVsn == RemVsn -> OurVsn;
     true -> wait_name_resolve(RemNode)
  end.


---
Best Regards,

Vladimir Sekissov



More information about the erlang-questions mailing list