oracular (3) rpc.3erl.gz

Provided by: erlang-manpages_25.3.2.12+dfsg-1ubuntu2_all bug

NAME

       rpc - Remote Procedure Call services.

DESCRIPTION

       This  module  contains  services similar to Remote Procedure Calls. It also contains broadcast facilities
       and parallel evaluators. A remote procedure call is a method to call a function  on  a  remote  node  and
       collect  the  answer.  It  is used for collecting information on a remote node, or for running a function
       with some specific side effects on the remote node.

   Note:
       rpc:call() and friends makes it quite hard to distinguish between successful results, raised  exceptions,
       and  other  errors.  This cannot be changed due to compatibility reasons. As of OTP 23, a new module erpc
       was introduced in order to provide an API that makes it possible to  distinguish  between  the  different
       results.  The  erpc module provides a subset (however, the central subset) of the functionality available
       in the rpc module. The erpc implementation also provides  a  more  scalable  implementation  with  better
       performance than the original rpc implementation. However, since the introduction of erpc, the rpc module
       implements large parts of its central functionality using erpc,  so  the  rpc  module  won't  not  suffer
       scalability wise and performance wise compared to erpc.

DATA TYPES

       key()

              Opaque value returned by async_call/4.

EXPORTS

       abcast(Name, Msg) -> abcast

              Types:

                 Name = atom()
                 Msg = term()

              Equivalent to abcast([node()|nodes()], Name, Msg).

       abcast(Nodes, Name, Msg) -> abcast

              Types:

                 Nodes = [node()]
                 Name = atom()
                 Msg = term()

              Broadcasts the message Msg asynchronously to the registered process Name on the specified nodes.

       async_call(Node, Module, Function, Args) -> Key

              Types:

                 Node = node()
                 Module = module()
                 Function = atom()
                 Args = [term()]
                 Key = key()

              Implements  call  streams  with promises, a type of RPC that does not suspend the caller until the
              result is finished. Instead, a key is returned, which can be used later to collect the value.  The
              key can be viewed as a promise to deliver the answer.

              In  this  case,  the  key  Key  is  returned, which can be used in a subsequent call to yield/1 or
              nb_yield/1,2 to retrieve the value of evaluating apply(Module, Function, Args) on node Node.

          Note:
              If you want the ability to distinguish between  results,  you  may  want  to  consider  using  the
              erpc:send_request()  function  from  the  erpc  module  instead.  This  also gives you the ability
              retrieve the results in other useful ways.

          Note:
              yield/1 and nb_yield/1,2 must be called by the same process from  which  this  function  was  made
              otherwise they will never yield correctly.

          Note:
              You  cannot make any assumptions about the process that will perform the apply(). It may be an rpc
              server, another server, or a freshly spawned process.

       block_call(Node, Module, Function, Args) -> Res | {badrpc, Reason}

              Types:

                 Node = node()
                 Module = module()
                 Function = atom()
                 Args = [term()]
                 Res = Reason = term()

              The same as calling rpc:block_call(Node, Module, Function, Args, infinity).

       block_call(Node, Module, Function, Args, Timeout) ->
                     Res | {badrpc, Reason}

              Types:

                 Node = node()
                 Module = module()
                 Function = atom()
                 Args = [term()]
                 Res = Reason = term()
                 Timeout = 0..4294967295 | infinity

              The same as calling rpc:call(Node, Module, Function, Args, Timeout) with  the  exception  that  it
              also blocks other rpc:block_call() operations from executing concurrently on the node Node.

          Warning:
              Note  that  it  also blocks other operations than just rpc:block_call() operations, so use it with
              care.

       call(Node, Module, Function, Args) -> Res | {badrpc, Reason}

              Types:

                 Node = node()
                 Module = module()
                 Function = atom()
                 Args = [term()]
                 Res = Reason = term()

              Evaluates apply(Module, Function, Args) on node Node and returns the corresponding value  Res,  or
              {badrpc,  Reason}  if  the  call fails. The same as calling rpc:call(Node, Module, Function, Args,
              infinity).

       call(Node, Module, Function, Args, Timeout) ->
               Res | {badrpc, Reason}

              Types:

                 Node = node()
                 Module = module()
                 Function = atom()
                 Args = [term()]
                 Res = Reason = term()
                 Timeout = 0..4294967295 | infinity

              Evaluates apply(Module, Function, Args) on node Node and returns the corresponding value  Res,  or
              {badrpc, Reason} if the call fails. Timeout is a time-out value in milliseconds. If the call times
              out, Reason is timeout.

              If the reply arrives after the call times out, no message contaminates the caller's message queue.

          Note:
              If you want the ability to distinguish between  results,  you  may  want  to  consider  using  the
              erpc:call() function from the erpc module instead.

          Note:
              Here follows the details of what exactly is returned.

              {badrpc, Reason} will be returned in the following circumstances:

                * The called function fails with an exit exception.

                * The called function fails with an error exception.

                * The called function returns a term that matches {'EXIT', _}.

                * The called function throws a term that matches {'EXIT', _}.

              Res is returned in the following circumstances:

                * The called function returns normally with a term that does not  match {'EXIT',_}.

                * The called function throws a term that does not  match {'EXIT',_}.

          Note:
              You  cannot  make  any  assumptions about the process that will perform the apply(). It may be the
              calling process itself, an rpc server, another server, or a freshly spawned process.

       cast(Node, Module, Function, Args) -> true

              Types:

                 Node = node()
                 Module = module()
                 Function = atom()
                 Args = [term()]

              Evaluates apply(Module, Function, Args) on node Node. No response is  delivered  and  the  calling
              process is not suspended until the evaluation is complete, as is the case with call/4,5.

          Note:
              You  cannot make any assumptions about the process that will perform the apply(). It may be an rpc
              server, another server, or a freshly spawned process.

       eval_everywhere(Module, Function, Args) -> abcast

              Types:

                 Module = module()
                 Function = atom()
                 Args = [term()]

              Equivalent to eval_everywhere([node()|nodes()], Module, Function, Args).

       eval_everywhere(Nodes, Module, Function, Args) -> abcast

              Types:

                 Nodes = [node()]
                 Module = module()
                 Function = atom()
                 Args = [term()]

              Evaluates apply(Module, Function, Args) on the specified nodes. No answers are collected.

       multi_server_call(Name, Msg) -> {Replies, BadNodes}

              Types:

                 Name = atom()
                 Msg = term()
                 Replies = [Reply :: term()]
                 BadNodes = [node()]

              Equivalent to multi_server_call([node()|nodes()], Name, Msg).

       multi_server_call(Nodes, Name, Msg) -> {Replies, BadNodes}

              Types:

                 Nodes = [node()]
                 Name = atom()
                 Msg = term()
                 Replies = [Reply :: term()]
                 BadNodes = [node()]

              Can be used when interacting with servers called Name on the specified nodes. It is  assumed  that
              the servers receive messages in the format {From, Msg} and reply using From ! {Name, Node, Reply},
              where Node is the name of the node where the server is located.  The  function  returns  {Replies,
              BadNodes}, where Replies is a list of all Reply values, and BadNodes is one of the following:

                * A list of the nodes that do not exist

                * A list of the nodes where the server does not exist

                * A list of the nodes where the server terminated before sending any reply.

       multicall(Module, Function, Args) -> {ResL, BadNodes}

              Types:

                 Module = module()
                 Function = atom()
                 Args = [term()]
                 ResL = [Res :: term() | {badrpc, Reason :: term()}]
                 BadNodes = [node()]

              Equivalent to multicall([node()|nodes()], Module, Function, Args, infinity).

       multicall(Nodes, Module, Function, Args) -> {ResL, BadNodes}

              Types:

                 Nodes = [node()]
                 Module = module()
                 Function = atom()
                 Args = [term()]
                 ResL = [Res :: term() | {badrpc, Reason :: term()}]
                 BadNodes = [node()]

              Equivalent to multicall(Nodes, Module, Function, Args, infinity).

       multicall(Module, Function, Args, Timeout) -> {ResL, BadNodes}

              Types:

                 Module = module()
                 Function = atom()
                 Args = [term()]
                 Timeout = 0..4294967295 | infinity
                 ResL = [Res :: term() | {badrpc, Reason :: term()}]
                 BadNodes = [node()]

              Equivalent to multicall([node()|nodes()], Module, Function, Args, Timeout).

       multicall(Nodes, Module, Function, Args, Timeout) ->
                    {ResL, BadNodes}

              Types:

                 Nodes = [node()]
                 Module = module()
                 Function = atom()
                 Args = [term()]
                 Timeout = 0..4294967295 | infinity
                 ResL = [Res :: term() | {badrpc, Reason :: term()}]
                 BadNodes = [node()]

              In contrast to an RPC, a multicall is an RPC that is sent concurrently from one client to multiple
              servers. This is useful for collecting 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, but the multicall is faster, as all the requests  are  sent  at
              the same time and are collected one by one as they come back.

              The  function  evaluates  apply(Module,  Function,  Args)  on the specified nodes and collects the
              answers. It returns {ResL, BadNodes}, where BadNodes is a list of the nodes that do not exist, and
              ResL  is  a  list  of  the return values, or {badrpc, Reason} for failing calls. Timeout is a time
              (integer) in milliseconds, or infinity.

              The following example is useful when new object code is to be loaded on all nodes in the  network,
              and indicates some side effects that RPCs can produce:

              %% Find object code for module Mod
              {Mod, Bin, File} = code:get_object_code(Mod),

              %% and load it on all nodes including this one
              {ResL, _} = rpc:multicall(code, load_binary, [Mod, File, Bin]),

              %% and then maybe check the ResL list.

          Note:
              If  you  want  the  ability  to  distinguish  between  results, you may want to consider using the
              erpc:multicall() function from the erpc module instead.

          Note:
              You cannot make any assumptions about the process that will perform the apply().  It  may  be  the
              calling process itself, an rpc server, another server, or a freshly spawned process.

       nb_yield(Key) -> {value, Val} | timeout

              Types:

                 Key = key()
                 Val = (Res :: term()) | {badrpc, Reason :: term()}

              Equivalent to nb_yield(Key, 0).

       nb_yield(Key, Timeout) -> {value, Val} | timeout

              Types:

                 Key = key()
                 Timeout = 0..4294967295 | infinity
                 Val = (Res :: term()) | {badrpc, Reason :: term()}

              Non-blocking  version  of  yield/1.  It  returns  the  tuple  {value, Val} when the computation is
              finished, or timeout when Timeout milliseconds has elapsed.

              See the note in call/4 for more details of Val.

          Note:
              This function must be called by the same process from which async_call/4  was  made  otherwise  it
              will only return timeout.

       parallel_eval(FuncCalls) -> ResL

              Types:

                 FuncCalls = [{Module, Function, Args}]
                 Module = module()
                 Function = atom()
                 Args = ResL = [term()]

              Evaluates,  for  every  tuple  in  FuncCalls,  apply(Module,  Function,  Args) on some node in the
              network. Returns the list of return values, in the same order as in FuncCalls.

       pinfo(Pid) -> [{Item, Info}] | undefined

              Types:

                 Pid = pid()
                 Item = atom()
                 Info = term()

              Location transparent version of the BIF erlang:process_info/1 in ERTS.

       pinfo(Pid, Item) -> {Item, Info} | undefined | []

       pinfo(Pid, ItemList) -> [{Item, Info}] | undefined | []

              Types:

                 Pid = pid()
                 Item = atom()
                 ItemList = [Item]
                 Info = term()

              Location transparent version of the BIF erlang:process_info/2 in ERTS.

       pmap(FuncSpec, ExtraArgs, List1) -> List2

              Types:

                 FuncSpec = {Module, Function}
                 Module = module()
                 Function = atom()
                 ExtraArgs = [term()]
                 List1 = [Elem :: term()]
                 List2 = [term()]

              Evaluates apply(Module, Function, [Elem|ExtraArgs]) for every element Elem in List1, in  parallel.
              Returns the list of return values, in the same order as in List1.

       sbcast(Name, Msg) -> {GoodNodes, BadNodes}

              Types:

                 Name = atom()
                 Msg = term()
                 GoodNodes = BadNodes = [node()]

              Equivalent to sbcast([node()|nodes()], Name, Msg).

       sbcast(Nodes, Name, Msg) -> {GoodNodes, BadNodes}

              Types:

                 Name = atom()
                 Msg = term()
                 Nodes = GoodNodes = BadNodes = [node()]

              Broadcasts the message Msg synchronously to the registered process Name on the specified nodes.

              Returns {GoodNodes, BadNodes}, where GoodNodes is the list of nodes that have Name as a registered
              process.

              The function is synchronous in the sense that it is known  that  all  servers  have  received  the
              message  when  the  call  returns.  It is not possible to know that the servers have processed the
              message.

              Any further messages sent to the servers, after this function has returned, are  received  by  all
              servers after this message.

       server_call(Node, Name, ReplyWrapper, Msg) ->
                      Reply | {error, Reason}

              Types:

                 Node = node()
                 Name = atom()
                 ReplyWrapper = Msg = Reply = term()
                 Reason = nodedown

              Can be used when interacting with a server called Name on node Node. It is assumed that the server
              receives messages in the format {From, Msg} and replies using From ! {ReplyWrapper, Node,  Reply}.
              This  function  makes such a server call and ensures that the entire call is packed into an atomic
              transaction, which either succeeds or fails. It never hangs, unless the server itself hangs.

              The function returns the answer Reply as produced by the server Name, or {error, Reason}.

       yield(Key) -> Res | {badrpc, Reason}

              Types:

                 Key = key()
                 Res = Reason = term()

              Returns the promised answer from a previous async_call/4.  If  the  answer  is  available,  it  is
              returned  immediately.  Otherwise,  the calling process is suspended until the answer arrives from
              Node.

          Note:
              This function must be called by the same process from which async_call/4  was  made  otherwise  it
              will never return.

              See the note in call/4 for more details of the return value.