Przeglądaj źródła

Better gen_rpc performance

GilbertWong 6 lat temu
rodzic
commit
4603ea17ef
1 zmienionych plików z 19 dodań i 9 usunięć
  1. 19 9
      src/emqx_rpc.erl

+ 19 - 9
src/emqx_rpc.erl

@@ -23,18 +23,28 @@
 -define(RPC, gen_rpc).
 
 call(Node, Mod, Fun, Args) ->
-    filter_result(?RPC:call(Node, Mod, Fun, Args)).
+    filter_result(?RPC:call(rpc_node(Node), Mod, Fun, Args)).
 
 multicall(Nodes, Mod, Fun, Args) ->
-    filter_result(?RPC:multicall(Nodes, Mod, Fun, Args)).
+    filter_result(?RPC:multicall(rpc_nodes(Nodes), Mod, Fun, Args)).
 
 cast(Node, Mod, Fun, Args) ->
-    filter_result(?RPC:cast(Node, Mod, Fun, Args)).
+    filter_result(?RPC:cast(rpc_node(Node), Mod, Fun, Args)).
 
-filter_result(Delivery) ->
-    case Delivery of 
-        {badrpc, Reason} -> {badrpc, Reason};
-        {badtcp, Reason} -> {badrpc, Reason};
-        _ -> Delivery
-    end.
+rpc_node(Node) ->
+    {Node, erlang:system_info(scheduler_id)}.
+
+rpc_nodes(Nodes) ->
+    rpc_nodes(Nodes, []).
+
+rpc_nodes([], Acc) ->
+    Acc;
+rpc_nodes([Node | Nodes], Acc) ->
+    rpc_nodes(Nodes, [rpc_node(Node) | Acc]).
 
+
+filter_result({Error, Reason})
+  when Error =:= badrpc; Error =:= badtcp ->
+    {badrpc, Reason};
+filter_result(Delivery) ->
+    Delivery.