case is_authorized?(am, peer, :call, proc, method) do
true ->
with {callees, _index} <- RealmSession.callees(db, realm, proc),
- {id, {pid, node}} <- get_live_callee(callees) do
+ {id, {pid, node}} <- get_live_callee(proxy, callees, 10) do
opts = Map.put(opts, "procedure", proc)
opts = Map.put(opts, "session_id", session_id)
defp get_auth_module(auth, _methods), do: auth
- defp get_live_callee([]) do
+ defp get_live_callee(_proxy, [], 0) do
+ Logger.error("No live callees, tried all replicas")
+ {:error, :no_live_callees}
+ end
+
+ defp get_live_callee(_proxy, [], _) do
Logger.error("No live callees, empty result from lookup")
{:error, :no_live_callees}
end
- defp get_live_callee(callees) do
- Enum.random(callees)
+ defp get_live_callee(proxy, callees, tries) when is_list(callees) do
+ {_id, {pid, node}} = c = Enum.random(callees)
+
+ nodes = [Node.self() | Node.list()]
+
+ with true <- node in nodes,
+ true <- GenServer.call({proxy, node}, {:is_up, pid}) do
+ c
+ else
+ false ->
+ Logger.error("#{inspect(c)} is ian invalid callee")
+ get_live_callee(proxy, callees, tries - 1)
+ end
+ end
+
+ defp get_live_callee(proxy, result, tries) do
+ Logger.error("No live callees, Proxy: #{inspect(proxy)} Result: #{inspect(result)} Tries: #{tries}")
+
+ {:error, :no_live_callees}
end
defp send_to_peer(msg, transport, pid) do