From: Christopher Coté Date: Wed, 8 Dec 2021 21:09:06 +0000 (-0500) Subject: verify callee is valid X-Git-Url: http://git.entropealabs.com/?a=commitdiff_plain;h=206176426dbe6728f37d6757cde16d67ebf00fde;p=wampex_router.git verify callee is valid --- diff --git a/lib/router/session.ex b/lib/router/session.ex index acbe30c..256ff34 100644 --- a/lib/router/session.ex +++ b/lib/router/session.ex @@ -437,7 +437,7 @@ defmodule Wampex.Router.Session do 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) @@ -787,13 +787,35 @@ defmodule Wampex.Router.Session do 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