Current section

Files

Jump to
elixium_core lib p2p host_availability host_check.ex
Raw

lib/p2p/host_availability/host_check.ex

defmodule Elixium.HostCheck do
alias Elixium.Store.Oracle
use GenServer
require IEx
require Logger
def start_link(_args) do
GenServer.start_link(__MODULE__, [], name: __MODULE__)
end
def init([]) do
Process.send_after(self(), :check_health, 1000)
{:ok, %{}}
end
def handle_info(:check_health, state) do
case Oracle.inquire(:"Elixir.Elixium.Store.PeerOracle", {:load_known_peers, []}) do
:not_found -> :ok
peers -> Enum.each(peers, &attempt_response/1)
end
Process.send_after(self(), :check_health, 600000)
{:noreply, state}
end
defp attempt_response({ip, _port}) do
with {:ok, socket} <- :gen_tcp.connect(ip, 31015, [:binary, active: true], 1000) do
:gen_tcp.send(socket, <<0>>)
end
end
def handle_info({:tcp_closed, _}, state) do
{:noreply, state}
end
def handle_info({:tcp, socket, <<1>>}, state) do
#Shuffle List
{:ok, {add, _port}} = :inet.peername(socket)
ip =
add
|> :inet_parse.ntoa()
Oracle.inquire(:"Elixir.Elixium.Store.PeerOracle", {:reorder_peers, [ip]})
{:noreply, state}
end
def handle_info({:tcp, _, _}, state), do: {:noreply, state}
end