]> Entropealabs - wampex_router.git/commitdiff
verify callee is valid
authorChristopher Coté <chris@entropealabs.com>
Wed, 8 Dec 2021 21:09:06 +0000 (16:09 -0500)
committerChristopher Coté <chris@entropealabs.com>
Wed, 8 Dec 2021 21:09:06 +0000 (16:09 -0500)
lib/router/session.ex

index acbe30c35938c210fa8002d471e8fb2437c25092..256ff3456c39c2b23b736e6b4efed55be301bebf 100644 (file)
@@ -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