diff --git a/lib/archethic/db/embedded_impl/p2p_view.ex b/lib/archethic/db/embedded_impl/p2p_view.ex index e24d5a3e75..be59355812 100644 --- a/lib/archethic/db/embedded_impl/p2p_view.ex +++ b/lib/archethic/db/embedded_impl/p2p_view.ex @@ -27,7 +27,7 @@ defmodule Archethic.DB.EmbeddedImpl.P2PView do (node_public_key :: Crypto.key()) => { available? :: boolean(), average_availability :: float(), - network_patch :: String.t() + network_patch :: String.t() | nil } } def get_views do @@ -74,11 +74,19 @@ defmodule Archethic.DB.EmbeddedImpl.P2PView do available_bit = if available?, do: 1, else: 0 avg_availability_int = (avg_availability * 100) |> trunc() - network_patch_bin = String.to_integer(network_patch, 16) + + network_patch_bin = + case network_patch do + nil -> + <<0::8>> + + _ -> + <<1::8, String.to_integer(network_patch, 16)::16>> + end acc = <> + DateTime.to_unix(availability_update)::32, network_patch_bin::binary>> serialize(rest, acc) end @@ -92,11 +100,14 @@ defmodule Archethic.DB.EmbeddedImpl.P2PView do {network_patch, rest} = case rest do - <> -> + <<1::8, network_patch_bin::16, rest::bitstring>> -> {Integer.to_string(network_patch_bin, 16), rest} + <<0::8, rest::bitstring>> -> + {nil, rest} + _ -> - {"", rest} + {nil, rest} end available? = if available_bit == 1, do: true, else: false diff --git a/lib/archethic/p2p/mem_table_loader.ex b/lib/archethic/p2p/mem_table_loader.ex index bf4d9b2209..3397b344ab 100644 --- a/lib/archethic/p2p/mem_table_loader.ex +++ b/lib/archethic/p2p/mem_table_loader.ex @@ -77,8 +77,7 @@ defmodule Archethic.P2P.MemTableLoader do is_same_slot? = DateTime.compare(DateTime.utc_now(), next_repair_time) == :lt p2p_summaries = DB.get_last_p2p_summaries() - - previously_available = Enum.filter(p2p_summaries, &match?({_, true, _, _}, &1)) + previously_available = Enum.filter(p2p_summaries, &match?({_, true, _, _, _}, &1)) node_key = Crypto.first_node_public_key() @@ -206,7 +205,7 @@ defmodule Archethic.P2P.MemTableLoader do defp first_node_change?(_, _), do: false defp load_p2p_summary( - {node_public_key, available?, avg_availability, availability_update}, + {node_public_key, available?, avg_availability, availability_update, network_patch}, is_same_slot? ) do if available? do @@ -218,5 +217,9 @@ defmodule Archethic.P2P.MemTableLoader do end MemTable.update_node_average_availability(node_public_key, avg_availability) + + if network_patch do + MemTable.update_node_network_patch(node_public_key, network_patch) + end end end diff --git a/lib/archethic/self_repair/sync.ex b/lib/archethic/self_repair/sync.ex index 9d4212e044..923661b1da 100644 --- a/lib/archethic/self_repair/sync.ex +++ b/lib/archethic/self_repair/sync.ex @@ -359,11 +359,14 @@ defmodule Archethic.SelfRepair.Sync do end P2P.set_node_average_availability(node_key, avg_availability) - P2P.update_node_network_patch(node_key, network_patch) + + if network_patch do + P2P.update_node_network_patch(node_key, network_patch) + end %Node{availability_update: availability_update} = P2P.get_node_info!(node_key) - {node_key, available?, avg_availability, availability_update} + {node_key, available?, avg_availability, availability_update, network_patch} end defp update_statistics(date, []) do