Skip to content

Commit

Permalink
Refactor tranform function
Browse files Browse the repository at this point in the history
  • Loading branch information
Neylix committed Apr 26, 2023
1 parent 927d7fd commit 4715913
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 35 deletions.
46 changes: 21 additions & 25 deletions lib/archethic/beacon_chain/slot.ex
Original file line number Diff line number Diff line change
Expand Up @@ -631,36 +631,32 @@ defmodule Archethic.BeaconChain.Slot do

def empty?(%__MODULE__{}), do: false

# This function will be used during the summary day of 1.0.8 upgrade. This function can be deleted after the upgrade.
def transform_1_0_8_summaries(slots) when is_list(slots) do
Task.Supervisor.async_stream_nolink(
TaskSupervisor,
slots,
&transform_1_0_8_summaries/1
)
|> Stream.filter(&match?({:ok, _}, &1))
|> Enum.map(fn {:ok, slot} -> slot end)
end

def transform_1_0_8_summaries(slot = %__MODULE__{transaction_attestations: attestations}) do
@doc """
Apply a tranformation of a transaction summary based on the blockchain version
"""
@spec transform(binary(), t()) :: t()
def transform(
"1.0.8",
slot = %__MODULE__{transaction_attestations: attestations}
) do
if Enum.any?(attestations, fn %ReplicationAttestation{version: version} -> version == 1 end) do
new_attestations = do_transform(attestations)
new_attestations =
Task.Supervisor.async_stream_nolink(
TaskSupervisor,
attestations,
fn attestation = %ReplicationAttestation{transaction_summary: summary} ->
new_summary = TransactionSummary.transform("1.0.8", summary)
%ReplicationAttestation{attestation | transaction_summary: new_summary}
end
)
|> Stream.filter(&match?({:ok, _}, &1))
|> Enum.map(fn {:ok, attestation} -> attestation end)

%__MODULE__{slot | transaction_attestations: new_attestations}
else
slot
end
end

defp do_transform(attestations) do
Task.Supervisor.async_stream_nolink(
TaskSupervisor,
attestations,
fn attestation = %ReplicationAttestation{transaction_summary: summary} ->
new_summary = TransactionSummary.transform_1_0_8_summary(summary)
%ReplicationAttestation{attestation | transaction_summary: new_summary}
end
)
|> Stream.filter(&match?({:ok, _}, &1))
|> Enum.map(fn {:ok, attestation} -> attestation end)
end
def transform(_, slot), do: slot
end
4 changes: 2 additions & 2 deletions lib/archethic/beacon_chain/subset.ex
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ defmodule Archethic.BeaconChain.Subset do
end

def handle_call(:get_current_slot, _from, state = %{current_slot: current_slot}) do
current_slot = Slot.transform_1_0_8_summaries(current_slot)
current_slot = Slot.transform("1.0.8", current_slot)
{:reply, current_slot, state}
end

Expand Down Expand Up @@ -353,7 +353,7 @@ defmodule Archethic.BeaconChain.Subset do
defp broadcast_beacon_slot(subset, next_time, slot) do
nodes = P2P.authorized_and_available_nodes(next_time, true)

slot = Slot.transform_1_0_8_summaries(slot)
slot = Slot.transform("1.0.8", slot)

subset
|> Election.beacon_storage_nodes(next_time, nodes)
Expand Down
2 changes: 1 addition & 1 deletion lib/archethic/beacon_chain/subset/summary_cache.ex
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ defmodule Archethic.BeaconChain.Subset.SummaryCache do
Enum.each(BeaconChain.list_subsets(), fn subset ->
:ets.take(@table_name, subset)
|> Enum.each(fn {subset, slot} ->
slot = Slot.transform_1_0_8_summaries(slot)
slot = Slot.transform("1.0.8", slot)
backup_slot(slot, "")
:ets.insert(@table_name, {subset, slot})
end)
Expand Down
12 changes: 6 additions & 6 deletions lib/archethic/transaction_chain/transaction_summary.ex
Original file line number Diff line number Diff line change
Expand Up @@ -214,14 +214,12 @@ defmodule Archethic.TransactionChain.TransactionSummary do
end

@doc """
This function will be used during the summary day of 1.0.8 upgrade. This function can be deleted after the upgrade.
Migrate this function into files 1.0.8-migrate_old_tx_summaries
Transform a TransactionSummary without version into a TransactionSummary v1
Apply a tranformation of a transaction summary based on the blockchain version
"""
@spec transform_1_0_8_summary(t()) :: t()
def transform_1_0_8_summary(tx_summary = %__MODULE__{version: 1}), do: tx_summary
@spec transform(binary(), t()) :: t()
def transform("1.0.8", tx_summary = %__MODULE__{version: 1}), do: tx_summary

def transform_1_0_8_summary(%__MODULE__{address: address}) do
def transform("1.0.8", %__MODULE__{address: address}) do
transaction =
case TransactionChain.get_transaction(address) do
{:ok, tx} ->
Expand All @@ -237,6 +235,8 @@ defmodule Archethic.TransactionChain.TransactionSummary do
from_transaction(transaction)
end

def transform(_, tx_summary), do: tx_summary

@doc """
This function will be used during the summary day of 1.0.8 upgrade. This function can be deleted after the upgrade.
Migrate this function into files 1.0.8-migrate_old_tx_summaries
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ defmodule Migration_1_0_8 do
end

defp create_attestation(tx_summary) do
new_tx_summary = TransactionSummary.transform_1_0_8_summary(tx_summary)
new_tx_summary = TransactionSummary.transform("1.0.8", tx_summary)
%ReplicationAttestation{version: 1, transaction_summary: new_tx_summary}
end

Expand Down

0 comments on commit 4715913

Please sign in to comment.