[erlang-questions] rpc:multicall/5 docs misleading?

Ignas Vyšniauskas <>
Wed Feb 27 12:04:31 CET 2013


Hi,

the docs for `rpc:multicall/5` claim:

> In contrast to an RPC, a multicall is an RPC which is sent concurrently from
> one client to multiple servers. This is useful for collecting some
> information from a set of nodes, or for calling a function on a set of nodes
> to achieve some side effects. It is *semantically the same as iteratively
> making a series of RPCs on all the nodes* <..>

So, I would expect that, since this works:

    get_results(Nodes) ->
        lists:zip(Nodes, [rpc:call(N, erlang, now, []) || N <- Nodes]).

this would also work:

    get_results(Nodes) ->
        {Results, BadNodes} = rpc:multicall(Nodes, erlang, now, []),
        lists:zip(Nodes, Results).

but the `lists:zip/2` will fail if some node is non-reachable during the
multicall since Results will be a shorter list, so in order to really be
semantically the same (assuming `Nodes` does not contain duplicate entries),
you would need:

    get_results(Nodes) ->
        {Results, BadNodes} = rpc:multicall(Nodes, erlang, now, []),
        FullResults = lists:append(
            lists:zip(Nodes -- BadNodes, Results),
            lists:zip(BadNodes, {badrpc, nodedown})
        ),
        %% restore original order
        [{N, Res} || N <- Nodes, {M, Res} <- FullResults, N == M].

Which, at least to me, is a bit unexpected given the docs.

I would suggest either clarifying the docs or, better, changing the
implementation
so that it becomes more useful. Clearly the returned `BadNodes` are just a
leftover from the response from `gen_server:multicall/4` and IMHO useless in
this case as it provides no information as to what went wrong and only
introduces confusion.

--
Ignas



More information about the erlang-questions mailing list