From 21f63e154a56f54ded8ca8dbfb82153ae931509e Mon Sep 17 00:00:00 2001 From: Sola-Aremu 'Pelumi Date: Sat, 26 Oct 2024 14:48:18 +0100 Subject: [PATCH 1/8] feat: adding ttl and delete api --- lib/groot/storage.ex | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/lib/groot/storage.ex b/lib/groot/storage.ex index b71cd8b..c9671a7 100644 --- a/lib/groot/storage.ex +++ b/lib/groot/storage.ex @@ -25,8 +25,19 @@ defmodule Groot.Storage do end # The main api for setting a keys value - def set(key, value) do - GenServer.call(__MODULE__, {:set, key, value}) + def set(key, value, expires_in \\ nil) do + GenServer.call(__MODULE__, {:set, key, value, expires_in}) + end + + # The main api for deleting a key + def delete(key) do + case :ets.lookup(__MODULE__, key) do + [] -> + :ok + + [{^key, _value}] -> + GenServer.call(__MODULE__, {:delete, key}) + end end # Deletes all keys in the currently connected cluster. This is only @@ -44,13 +55,26 @@ defmodule Groot.Storage do {:ok, %{table: tab, registers: registers}} end - def handle_call({:set, key, value}, _from, data) do + def handle_call({:set, key, value, expires_in}, _from, data) do registers = Map.update(data.registers, key, Register.new(key, value), fn reg -> Register.update(reg, value) end) :ets.insert(data.table, {key, registers[key].value}) GenServer.abcast(__MODULE__, {:update_register, registers[key]}) + case expires_in == nil do + true -> :ok + false -> Process.send_after(self(), {:delete, key}, expires_in) + end + + {:reply, :ok, %{data | registers: registers}} + end + + def handle_call({:delete, key}, _from, data) do + registers = Map.delete(data.registers, key) + :ets.delete(data.table, key) + GenServer.abcast(__MODULE__, {:propagate_delete, registers[key]}) + {:reply, :ok, %{data | registers: registers}} end @@ -79,6 +103,12 @@ defmodule Groot.Storage do {:noreply, %{data | registers: new_registers}} end + def handle_cast({:propagate_delete, reg}, data) do + registers = Map.delete(data.registers, reg.key) + :ets.delete(data.table, reg.key) + {:noreply, %{data | registers: registers}} + end + def handle_info(msg, data) do case msg do {:nodeup, node} -> From 18aff33b76f87c06a2c65c3190b7d8db287b7da0 Mon Sep 17 00:00:00 2001 From: Sola-Aremu 'Pelumi Date: Sat, 26 Oct 2024 14:50:20 +0100 Subject: [PATCH 2/8] fix: removing comparison for expire_in --- lib/groot/storage.ex | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/groot/storage.ex b/lib/groot/storage.ex index c9671a7..1966387 100644 --- a/lib/groot/storage.ex +++ b/lib/groot/storage.ex @@ -62,9 +62,9 @@ defmodule Groot.Storage do :ets.insert(data.table, {key, registers[key].value}) GenServer.abcast(__MODULE__, {:update_register, registers[key]}) - case expires_in == nil do - true -> :ok - false -> Process.send_after(self(), {:delete, key}, expires_in) + case expires_in do + nil -> :ok + _ -> Process.send_after(self(), {:delete, key}, expires_in) end {:reply, :ok, %{data | registers: registers}} From 1ea9504fc02352ef42c6cdf4bae3640d8bc6837e Mon Sep 17 00:00:00 2001 From: Sola-Aremu 'Pelumi Date: Sat, 26 Oct 2024 15:00:59 +0100 Subject: [PATCH 3/8] fix: update groot public api with set/3 and delete/1 --- lib/groot.ex | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/lib/groot.ex b/lib/groot.ex index 0b67eda..319f15a 100644 --- a/lib/groot.ex +++ b/lib/groot.ex @@ -52,9 +52,16 @@ defmodule Groot do @doc """ Sets the value for a register. """ - @spec set(term(), term()) :: :ok - def set(key, value) do - Storage.set(key, value) + @spec set(term(), term(), term() | nil) :: :ok + def set(key, value, expires_in \\ nil) do + Storage.set(key, value, expires_in) end -end + @doc """ + Deletes a register + """ + @spec delete(term()) :: :ok + def delete(key) do + Storage.delete(key) + end +end From 38072ca44727a09c6b28222217968c63ac6ca41d Mon Sep 17 00:00:00 2001 From: Sola-Aremu 'Pelumi Date: Sat, 26 Oct 2024 16:19:21 +0100 Subject: [PATCH 4/8] fix: delete key --- lib/groot/storage.ex | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/groot/storage.ex b/lib/groot/storage.ex index 1966387..2349b97 100644 --- a/lib/groot/storage.ex +++ b/lib/groot/storage.ex @@ -73,7 +73,7 @@ defmodule Groot.Storage do def handle_call({:delete, key}, _from, data) do registers = Map.delete(data.registers, key) :ets.delete(data.table, key) - GenServer.abcast(__MODULE__, {:propagate_delete, registers[key]}) + GenServer.abcast(__MODULE__, {:propagate_delete, key}) {:reply, :ok, %{data | registers: registers}} end @@ -103,9 +103,9 @@ defmodule Groot.Storage do {:noreply, %{data | registers: new_registers}} end - def handle_cast({:propagate_delete, reg}, data) do - registers = Map.delete(data.registers, reg.key) - :ets.delete(data.table, reg.key) + def handle_cast({:propagate_delete, key}, data) do + registers = Map.delete(data.registers, key) + :ets.delete(data.table, key) {:noreply, %{data | registers: registers}} end From eac46554f2649b96ab5e093e5d151db3a9dd3220 Mon Sep 17 00:00:00 2001 From: Sola-Aremu 'Pelumi Date: Sat, 26 Oct 2024 17:10:46 +0100 Subject: [PATCH 5/8] fix: use handle info to achieve ttl --- lib/groot/storage.ex | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/groot/storage.ex b/lib/groot/storage.ex index 2349b97..1867513 100644 --- a/lib/groot/storage.ex +++ b/lib/groot/storage.ex @@ -120,6 +120,10 @@ defmodule Groot.Storage do schedule_sync_timeout() {:noreply, data} + :delete -> + GenServer.call(__MODULE__, {:delete, data}) + {:noreply, data} + _msg -> {:noreply, data} end From f89e18043aaf4b043de010537aba8d7619560fba Mon Sep 17 00:00:00 2001 From: Sola-Aremu 'Pelumi Date: Sat, 26 Oct 2024 18:40:33 +0100 Subject: [PATCH 6/8] fix: deletion info --- lib/groot/storage.ex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/groot/storage.ex b/lib/groot/storage.ex index 1867513..7361894 100644 --- a/lib/groot/storage.ex +++ b/lib/groot/storage.ex @@ -120,8 +120,8 @@ defmodule Groot.Storage do schedule_sync_timeout() {:noreply, data} - :delete -> - GenServer.call(__MODULE__, {:delete, data}) + {:delete, key} -> + GenServer.call(__MODULE__, {:delete, key}) {:noreply, data} _msg -> From 4ab801bef90e16f1e71da38dadeabd0cc3b612ed Mon Sep 17 00:00:00 2001 From: Sola-Aremu 'Pelumi Date: Sat, 26 Oct 2024 19:03:48 +0100 Subject: [PATCH 7/8] feat: updating handle info delete --- lib/groot/storage.ex | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/groot/storage.ex b/lib/groot/storage.ex index 7361894..ae8abb1 100644 --- a/lib/groot/storage.ex +++ b/lib/groot/storage.ex @@ -121,7 +121,7 @@ defmodule Groot.Storage do {:noreply, data} {:delete, key} -> - GenServer.call(__MODULE__, {:delete, key}) + delete_record(key, data) {:noreply, data} _msg -> @@ -145,4 +145,11 @@ defmodule Groot.Storage do |> Enum.map(fn key -> {key, Register.latest(r1[key], r2[key])} end) |> Enum.into(%{}) end + + defp delete_record(key, data) do + registers = Map.delete(data.registers, key) + :ets.delete(data.table, key) + GenServer.abcast(__MODULE__, {:propagate_delete, key}) + registers + end end From 3ed780249a45c8100bef6c071d78d3ae401f2157 Mon Sep 17 00:00:00 2001 From: Sola-Aremu 'Pelumi Date: Sat, 26 Oct 2024 22:25:13 +0100 Subject: [PATCH 8/8] fix: updating registers on delete --- lib/groot/storage.ex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/groot/storage.ex b/lib/groot/storage.ex index ae8abb1..15cd4c2 100644 --- a/lib/groot/storage.ex +++ b/lib/groot/storage.ex @@ -121,8 +121,8 @@ defmodule Groot.Storage do {:noreply, data} {:delete, key} -> - delete_record(key, data) - {:noreply, data} + registers = delete_record(key, data) + {:noreply, %{data | registers: registers}} _msg -> {:noreply, data}