erlang epmd kill

Problem

  • When Erlang version is lower than 22, if the epmd service is killed during operation, the node cannot automatically register the epmd service
  • Even if you use remsh, rpc, pipe, etc. to enter the node operation
  • Cannot execute related node commands normally
  • May cause data to not be persisted
  • Cross-server activities cannot be started normally

Solution

A. Upgrade to erlang r24 version

  • The project code supports r24

B. Add a listening process to automatically inject the epmd service

  • Add a gen_server to check every 5 seconds

-spec get_epmd_port() -> integer().
get_epmd_port() ->
    erlang:get(epmd_port).

-spec set_epmd_port(EpmdPort :: integer()) -> undefined | integer().
set_epmd_port(EpmdPort) -> 
    erlang:put(epmd_port, EpmdPort).

do_init() -> 
    set_epmd_port(0), 
    OK.

do_loop_by_5_second(_Millisecond) -> 
    OldEpmdPort = get_epmd_port(), 
    case OldEpmdPort > 0 of 
        true -> 
            maybe_register_node(OldEpmdPort); 
        _ -> 
            init_epmd_port() 
    end, 
    OK.

init_epmd_port() -> 
    CustomIP = mmgr_init:get_custom_ip(), 
    {ok, NameList} = erl_epmd:names(CustomIP), 
    NodeName = mmgr_init:get_node_prefix_name(), 
    case lists:keyfind(NodeName, 1, NameList) of 
        {NodeName, EpmdPort} when EpmdPort > 0 -> 
            set_epmd_port(EpmdPort); 
        _ -> 
            ignore 
    end, 
    OK.

maybe_register_node(OldEpmdPort) -> 
    CustomIP = mmgr_init:get_custom_ip(), 
    {ok, NameList} = erl_epmd:names(CustomIP), 
    NodeName = mmgr_init:get_node_prefix_name(), 
    case lists:keyfind(NodeName, 1, NameList) of 
        {NodeName, OldEpmdPort} -> 
            ignore; 
        {NodeName, NewEpmdPort} when NewEpmdPort > 0 -> 
            set_epmd_port(NewEpmdPort); 
        _ -> 
            case erl_epmd:register_node(NodeName, OldEpmdPort) of 
                {ok, Creation} -> 
                    io:format("~s reconnect epmd at ~w succeed. Creation=~w", [NodeName, OldEpmdPort, Creation]);
                Error ->
                    io:format("~s reconnect epmd at ~w error. Error=~w", [Error])
            end
    end,
ok.

Others

Some problems with epmd

epmd disadvantages

Custom implementation of epmd