小编kim*_*ang的帖子

erlang集群中的多个nodedown消息

我正在构建一个简单的gen_server模块,它监视多个远程节点的活动

当远程节点注册时,该模块使用erlang监视节点:monitor_node(Node,true).每个节点仅注册一次(使用日志确认)

并且在gen_server的handle_info/2回调中,它捕获{nodedown,Node}消息并使用erlang:monitor_node(Node,false)对该节点进行恶魔化.我希望只收到一次此消息:远程节点关闭时.

当我测试模块时,我发现当远程节点出现故障时,会向gen_server发送数百条{nodedown,Node}消息(数量从几百到几千不等).

为什么monitor_node发送了多条消息?我该如何防止这种行为?

编辑:这是(部分)源代码

register_node(#node_info{node = NodeName} = NodeInfo) ->
    case mnesia:read(node_info, NodeName) of
        [] ->
            monitor_node(NodeName, true),
            error_logger:info_msg("node ~p registered", [NodeName]);
        [_OldInfo] ->
            error_logger:trace_msg("info of node ~p updated", [NodeName])
    end,
    mnesia:write(NodeInfo).

handle_cast({register_node, #node_info{} = NodeStatus}, Timer) ->
    case mnesia:transaction(fun register_node/1, [NodeStatus]) of
        {aborted, Reason} ->
            error_logger:warning_msg("transaction register_node failed: ~p", [Reason]);
        _ ->
        ok
    end,
    {noreply, Timer};
handle_cast({shutdown_node, #node_info{} = NodeStatus}, Timer) ->
    case mnesia:dirty_delete_object(NodeStatus) of
        {aborted, Reason} ->
            error_logger:warning_msg("transaction shutdown_node failed: ~p", [Reason]);
        _ ->
        ok
    end, …
Run Code Online (Sandbox Code Playgroud)

erlang

2
推荐指数
1
解决办法
353
查看次数

标签 统计

erlang ×1