add 1 min fallback poll to recheck servers w/o instances

This commit is contained in:
mithereal 2022-07-31 16:42:14 -07:00
parent 075f471358
commit da4735fe2b
4 changed files with 57 additions and 2 deletions

View File

@ -6,6 +6,7 @@ defmodule Farside.Application do
require Logger
alias Farside.LastUpdated
alias Farside.Check
alias Farside.Sync
alias Farside.Http
@ -22,7 +23,7 @@ defmodule Farside.Application do
maybe_loaded_children =
case is_nil(System.get_env("FARSIDE_TEST")) do
true ->
[{Sync, []}]
[{Check, []}, {Sync, []}]
false ->
Logger.info("Skipping sync job setup...")
@ -82,5 +83,4 @@ defmodule Farside.Application do
response
end
end

28
lib/farside/check.ex Normal file
View File

@ -0,0 +1,28 @@
defmodule Farside.Check do
use Task
def child_spec(args) do
%{
id: __MODULE__,
start: {__MODULE__, :start_link, [args]},
type: :worker
}
end
def start_link(_arg) do
Task.start_link(&poll/0)
end
def poll() do
receive do
after
60_000 ->
run()
poll()
end
end
defp run() do
Farside.Instance.Supervisor.sync_empty_instances()
end
end

View File

@ -76,6 +76,25 @@ defmodule Farside.Instance do
{:noreply, state}
end
def handle_cast(
:check,
state
) do
service = :ets.lookup(String.to_atom(state.type), :default)
{_, service} = List.first(service)
if Enum.count(service.instances) == 0 do
service = Http.fetch_instances(service)
:ets.delete(String.to_atom(state.type), :data)
:ets.insert(state.ref, {:data, service})
end
{:noreply, state}
end
@doc false
def via_tuple(data, registry \\ @registry_name) do
{:via, Registry, {registry, data}}

View File

@ -90,4 +90,12 @@ defmodule Farside.Instance.Supervisor do
_ -> true
end
end
def sync_empty_instances() do
list()
|> Enum.each(fn x ->
SERVER.via_tuple(x)
|> GenServer.cast(:check)
end)
end
end