Use a registry for nts clients

This commit is contained in:
Mike Cifelli 2024-03-28 09:33:39 -04:00
parent d726089705
commit 06f165fc36
Signed by: mike
GPG Key ID: 6B08C6BE47D08E4C
3 changed files with 19 additions and 10 deletions

View File

@ -15,8 +15,9 @@ defmodule Chronoscope.Application do
{Finch, name: Chronoscope.Finch},
# Start a worker by calling: Chronoscope.Worker.start_link(arg)
# {Chronoscope.Worker, arg},
{DynamicSupervisor, name: Chronoscope.DynamicSupervisor, strategy: :one_for_one},
{Task.Supervisor, name: Chronoscope.TaskSupervisor},
{DynamicSupervisor, name: Chronoscope.NTS.DynamicSupervisor, strategy: :one_for_one},
{Task.Supervisor, name: Chronoscope.NTS.TaskSupervisor},
{Registry, [keys: :unique, name: Chronoscope.NTS.Registry]},
# Start to serve requests, typically the last entry
ChronoscopeWeb.Endpoint
]

View File

@ -14,19 +14,26 @@ defmodule Chronoscope.NTS do
end
def list() do
Chronoscope.DynamicSupervisor
NTS.DynamicSupervisor
|> DynamicSupervisor.which_children()
|> Enum.map(fn {_, pid, _, _} -> GenServer.call(pid, :list) end)
end
def key_establishment(host, port) do
# todo don't use atoms for this
name = String.to_atom("#{host}:#{port}")
name = "#{host}:#{port}"
if GenServer.whereis(name) == nil do
DynamicSupervisor.start_child(Chronoscope.DynamicSupervisor, {NTS.Client, host: host, port: port, name: name})
case Registry.lookup(NTS.Registry, name) do
[{pid, _}] ->
GenServer.call(pid, :key_establishment)
[] ->
NTS.DynamicSupervisor
|> DynamicSupervisor.start_child({
NTS.Client,
host: host, port: port, name: {:via, Registry, {NTS.Registry, name}}
})
key_establishment(host, port)
end
GenServer.call(name, :key_establishment)
end
end

View File

@ -1,6 +1,7 @@
defmodule Chronoscope.NTS.Client do
use GenServer
alias Chronoscope.NTS
alias Chronoscope.NTS.KeyEstablishmentClient
@interval_in_seconds 30
@ -54,7 +55,7 @@ defmodule Chronoscope.NTS.Client do
defp server_response(state) do
server = Map.take(state, [:host, :port])
Chronoscope.TaskSupervisor
NTS.TaskSupervisor
|> Task.Supervisor.async(fn -> KeyEstablishmentClient.key_establishment(server) end)
|> Task.await()
end