Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use PartitionSupervisor for ChainWriter #1039

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 4 additions & 12 deletions lib/archethic/db/embedded_impl/chain_writer.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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 """
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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()

Expand Down
25 changes: 9 additions & 16 deletions lib/archethic/db/embedded_impl/supervisor.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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},
Expand All @@ -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
1 change: 0 additions & 1 deletion test/archethic/db/embedded_impl/chain_index_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -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 ->
Expand Down