case is_authorized?(am, peer, :call, proc, method) do
true ->
with {callees, _index} <- RealmSession.callees(db, realm, proc),
- {id, {pid, node}} <- get_live_callee(proxy, callees, 10) do
+ {id, {pid, node}} <- get_live_callee(proxy, callees, 10, db, realm, proc) 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(_proxy, [], 0) do
+ defp get_live_callee(_proxy, [], 0, _db, _realm, _proc) do
Logger.error("No live callees, tried all replicas")
{:error, :no_live_callees}
end
- defp get_live_callee(_proxy, [], _) do
+ defp get_live_callee(_proxy, [], _, _, _, _) do
Logger.error("No live callees, empty result from lookup")
{:error, :no_live_callees}
end
- defp get_live_callee(proxy, callees, tries) when is_list(callees) do
+ defp get_live_callee(proxy, callees, tries, db, realm, proc) when is_list(callees) do
{_id, {pid, node}} = c = Enum.random(callees)
nodes = [Node.self() | Node.list()]
c
else
false ->
- Logger.error("#{inspect(c)} is ian invalid callee")
- get_live_callee(proxy, callees, tries - 1)
+ Logger.error("#{inspect(c)} is an invalid callee, purging...")
+ RealmSession.remove_value(db, realm, proc, {pid, node})
+ callees = List.delete(callees, c)
+ get_live_callee(proxy, callees, tries - 1, db, realm, proc)
end
end
- defp get_live_callee(proxy, result, tries) do
+ 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}