From 6462e18954512be2ae2a9e2856f9afa96b85abe9 Mon Sep 17 00:00:00 2001 From: Neylix Date: Tue, 16 May 2023 14:18:30 +0200 Subject: [PATCH] Use PartitionSupervisor for ChainWriter --- .../db/embedded_impl/chain_writer.ex | 16 +++--------- lib/archethic/db/embedded_impl/supervisor.ex | 25 +++++++------------ .../db/embedded_impl/chain_index_test.exs | 1 - 3 files changed, 13 insertions(+), 29 deletions(-) diff --git a/lib/archethic/db/embedded_impl/chain_writer.ex b/lib/archethic/db/embedded_impl/chain_writer.ex index 8ee44d522..adba1e8f4 100644 --- a/lib/archethic/db/embedded_impl/chain_writer.ex +++ b/lib/archethic/db/embedded_impl/chain_writer.ex @@ -11,6 +11,7 @@ defmodule Archethic.DB.EmbeddedImpl.ChainWriter do alias Archethic.DB.EmbeddedImpl.Encoding alias Archethic.DB.EmbeddedImpl.ChainIndex + alias Archethic.DB.EmbeddedImpl.ChainWriterSupervisor alias Archethic.TransactionChain.Transaction alias Archethic.TransactionChain.Transaction.ValidationStamp @@ -26,9 +27,8 @@ defmodule Archethic.DB.EmbeddedImpl.ChainWriter do """ @spec append_transaction(binary(), Transaction.t()) :: :ok def append_transaction(genesis_address, tx = %Transaction{}) do - partition = :erlang.phash2(genesis_address, 20) - [{_, pid}] = :ets.lookup(:archethic_db_chain_writers, partition) - GenServer.call(pid, {:append_tx, genesis_address, tx}) + via_tuple = {:via, PartitionSupervisor, {ChainWriterSupervisor, genesis_address}} + GenServer.call(via_tuple, {:append_tx, genesis_address, tx}) end @doc """ @@ -107,13 +107,10 @@ defmodule Archethic.DB.EmbeddedImpl.ChainWriter do def init(arg) do db_path = Keyword.get(arg, :path) - partition = Keyword.get(arg, :partition) - - :ets.insert(:archethic_db_chain_writers, {partition, self()}) setup_folders(db_path) - {:ok, %{db_path: db_path, partition: partition}} + {:ok, %{db_path: db_path}} end defp setup_folders(path) do @@ -152,11 +149,6 @@ defmodule Archethic.DB.EmbeddedImpl.ChainWriter do {:reply, :ok, state} end - def terminate(_reason, _state = %{partition: partition}) do - :ets.delete(:archethic_db_chain_writers, partition) - :ignore - end - defp write_transaction(genesis_address, tx, db_path) do start = System.monotonic_time() diff --git a/lib/archethic/db/embedded_impl/supervisor.ex b/lib/archethic/db/embedded_impl/supervisor.ex index 3d7cfc912..ca535121e 100644 --- a/lib/archethic/db/embedded_impl/supervisor.ex +++ b/lib/archethic/db/embedded_impl/supervisor.ex @@ -5,6 +5,7 @@ defmodule Archethic.DB.EmbeddedImpl.Supervisor do alias Archethic.DB.EmbeddedImpl.BootstrapInfo alias Archethic.DB.EmbeddedImpl.ChainWriter + alias Archethic.DB.EmbeddedImpl.ChainWriterSupervisor alias Archethic.DB.EmbeddedImpl.ChainIndex alias Archethic.DB.EmbeddedImpl.P2PView alias Archethic.DB.EmbeddedImpl.StatsInfo @@ -21,16 +22,17 @@ defmodule Archethic.DB.EmbeddedImpl.Supervisor do path = Archethic.DB.EmbeddedImpl.db_path() Logger.info("Load database at #{path}") File.mkdir_p!(path) - :ets.new(:archethic_db_chain_writers, [:named_table, :public]) - DynamicSupervisor.start_link( - strategy: :one_for_one, - name: Archethic.DB.EmbeddedImpl.ChainWriterSupervisor - ) - - initialize_chain_writers(path) + # Remove old things while in hot reload + # TODO remove after version 1.1.0 + if :ets.whereis(:archethic_db_chain_writers) != :undefined do + :ets.delete(:archethic_db_chain_writers) + DynamicSupervisor.stop(ChainWriterSupervisor) + end children = [ + {PartitionSupervisor, + child_spec: {ChainWriter, path: path}, name: ChainWriterSupervisor, partitions: 20}, chain_index_cache(), {ChainIndex, path: path}, {BootstrapInfo, path: path}, @@ -54,13 +56,4 @@ defmodule Archethic.DB.EmbeddedImpl.Supervisor do ]} } end - - defp initialize_chain_writers(path) do - Enum.each(0..19, fn i -> - DynamicSupervisor.start_child( - Archethic.DB.EmbeddedImpl.ChainWriterSupervisor, - {ChainWriter, path: path, partition: i} - ) - end) - end end diff --git a/test/archethic/db/embedded_impl/chain_index_test.exs b/test/archethic/db/embedded_impl/chain_index_test.exs index 38a0a919f..35bbf405a 100644 --- a/test/archethic/db/embedded_impl/chain_index_test.exs +++ b/test/archethic/db/embedded_impl/chain_index_test.exs @@ -9,7 +9,6 @@ defmodule Archethic.DB.EmbeddedImpl.ChainIndexTest do db_path = Application.app_dir(:archethic, "data_test") File.mkdir_p!(db_path) - :ets.new(:archethic_db_chain_writers, [:named_table, :public]) {:ok, _} = ChainWriter.start_link(path: db_path) on_exit(fn ->