From 7ba3b1cd4fa63d719db9a60792871b10679c8cfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20B=C3=B6hme?= Date: Wed, 7 Aug 2024 10:33:19 +0200 Subject: [PATCH] feat: extend supervision tree --- lib/todo/cache.ex | 34 +++++++++++++--------------------- lib/todo/database.ex | 2 +- lib/todo/database_worker.ex | 2 +- lib/todo/server.ex | 8 ++++++-- 4 files changed, 21 insertions(+), 25 deletions(-) diff --git a/lib/todo/cache.ex b/lib/todo/cache.ex index 32b48c8..672966a 100644 --- a/lib/todo/cache.ex +++ b/lib/todo/cache.ex @@ -1,33 +1,25 @@ defmodule Todo.Cache do - use GenServer + use DynamicSupervisor - @impl GenServer - def init(_init_args) do + def start_link(init_arg) do IO.puts("Starting #{__MODULE__}") - {:ok, %{}} + DynamicSupervisor.start_link(__MODULE__, init_arg, name: __MODULE__) end - @impl GenServer - def handle_call({:server_process, name}, _from, state) do - case Map.fetch(state, name) do - {:ok, process} -> - {:reply, process, state} + @impl DynamicSupervisor + def init(_) do + DynamicSupervisor.init(strategy: :one_for_one) + end - :error -> - {:ok, new_process} = Todo.Server.start_link(name) - - new_state = Map.put(state, name, new_process) - - {:reply, new_process, new_state} + def server_process(todo_list_name) do + case start_child(todo_list_name) do + {:ok, pid} -> pid + {:error, {:already_started, pid}} -> pid end end - def start_link(_) do - GenServer.start_link(__MODULE__, nil, name: __MODULE__) - end - - def server_process(name) do - GenServer.call(__MODULE__, {:server_process, name}) + defp start_child(todo_list_name) do + DynamicSupervisor.start_child(__MODULE__, {Todo.Server, todo_list_name}) end end diff --git a/lib/todo/database.ex b/lib/todo/database.ex index 9d67f38..f7112bb 100644 --- a/lib/todo/database.ex +++ b/lib/todo/database.ex @@ -45,6 +45,6 @@ defmodule Todo.Database do end defp choose_worker(key) do - :erlang.phash2(key, @pool_size) + :erlang.phash2(key, @pool_size) + 1 end end diff --git a/lib/todo/database_worker.ex b/lib/todo/database_worker.ex index 8005d0c..1ffd956 100644 --- a/lib/todo/database_worker.ex +++ b/lib/todo/database_worker.ex @@ -44,7 +44,7 @@ defmodule Todo.DatabaseWorker do {:ok, contents} -> :erlang.binary_to_term(contents) - _ -> + {:error, :enoent} -> nil end diff --git a/lib/todo/server.ex b/lib/todo/server.ex index 21b0dba..15af6b1 100644 --- a/lib/todo/server.ex +++ b/lib/todo/server.ex @@ -1,8 +1,12 @@ defmodule Todo.Server do - use GenServer + use GenServer, restart: :temporary def start_link(name) do - GenServer.start_link(__MODULE__, name) + GenServer.start_link(__MODULE__, name, name: via_tuple(name)) + end + + def via_tuple(name) do + Todo.ProcessRegistry.via_tuple({__MODULE__, name}) end def add(pid, entry) do