0

我对钢筋下的分布式测试有一些问题。Rebar 以 name 开始节点nonode@nohost。在它之后,我调用make_distrib提供正常节点名称的帮助函数并开始分发工作。
启动从节点后,我无法向它发送任何 lambda。我有错误:

    =错误报告==== 2013 年 7 月 27 日::22:48:02 ===
    节点“test1@just”上的进程出错,退出值:{{badfun,#Fun<msg_proxy_tests.2.117197241>},[{error_handler,undefined_lambda,3,[{file,"error_handler.erl"},{line,64 }]}]}

但!如果我以简单的方式运行它测试 - 一切都很好:

    $erl
    1> c(msg_proxy_tests)。
    {好的,msg_proxy_tests}
    2> eunit:test({module, msg_proxy_tests},[详细])。
    ========================= EUnit ========================
    模块'msg_proxy_tests'msg_proxy_tests:distrib_mode_test_(节点的分布式模式测试)...
    msg_proxy_tests.erl:14:<0.48.0>: 节点 () = [test1@just]
    msg_proxy_tests.erl:15:<9999.39.0>: 节点 () = test1@just
    msg_proxy_tests.erl:17:<0.48.0>: 节点 () = [test1@just]
    [0.238 秒] 好

我怎样才能解决这个问题?


模块来源:

    -模块(msg_proxy_tests)。

    -include_lib("eunit/include/eunit.hrl")。

    distrib_mode_test_()->
    {"节点的分布式模式测试", timeout, 60,
        乐趣()->
            {ok, 主机} = inet:gethostname(),
            make_distrib("tests@"++Host, shortnames),
            从机:开始(主机,test1),
            ?debugVal(节点()),
            spawn(list_to_atom("test1@"++Host), fun()-> ?debugVal(node()) end),
            定时器:睡眠(100),
            ?debugVal(节点()),
            stop_distrib(),
            行
        结尾}。

    -spec make_distrib(NodeName::string()|atom(), NodeType::shortnames | longnames) ->
        {ok, ActualNodeName::atom} | {错误,原因::term()}。
    make_distrib(NodeName, NodeType) 当 is_list(NodeName) ->
        make_distrib(erlang:list_to_atom(NodeName), NodeType);
    make_distrib(节点名称,节点类型)->
        案例节点()的
            'nonode@nohost' ->
                [] = os:cmd("epmd -daemon"),
                案例 net_kernel:start([NodeName, NodeType]) of
                    {ok, _Pid} -> 节点()
                结尾;
            CurrNode -> CurrNode
        结尾。

    stop_distrib()->
        网络内核:停止()。

4

1 回答 1

1

那是因为两个节点上的模块哈希是不同的。发生这种情况是因为 eunit 在运行之前编译代码并且模块包含-ifdef(TEST)宏,这肯定会改变它的哈希值。

这就是为什么#Fun<msg_proxy_tests.2.117197241无法调用匿名函数并发生错误的原因。(查看函数名称,您会注意到有趣的数字,这是模块哈希,两个节点上会有所不同)。

如果你想避免这种情况,你应该用它的完全限定名称来调用 funs: module:fun_name/arity

于 2013-07-29T07:07:31.817 回答