Skip to content

Commit

Permalink
Rename DB paging_state to paging_address
Browse files Browse the repository at this point in the history
  • Loading branch information
Neylix committed Jan 11, 2024
1 parent 106b0f7 commit bddcc80
Show file tree
Hide file tree
Showing 9 changed files with 68 additions and 61 deletions.
2 changes: 1 addition & 1 deletion lib/archethic/db.ex
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ defmodule Archethic.DB do
binary(),
fields :: list(),
opts :: [
paging_state: nil | binary(),
paging_address: nil | binary(),
after: DateTime.t(),
order: :asc | :desc
]
Expand Down
2 changes: 1 addition & 1 deletion lib/archethic/db/embedded_impl.ex
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ defmodule Archethic.DB.EmbeddedImpl do
"""
@spec get_transaction_chain(address :: binary(), fields :: list(), opts :: list()) ::
{transactions_by_page :: list(Transaction.t()), more? :: boolean(),
paging_state :: nil | binary()}
paging_address :: nil | binary()}
def get_transaction_chain(address, fields \\ [], opts \\ [])
when is_binary(address) and is_list(fields) and is_list(opts) do
ChainReader.get_transaction_chain(address, fields, opts, db_path())
Expand Down
56 changes: 28 additions & 28 deletions lib/archethic/db/embedded_impl/chain_reader.ex
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ defmodule Archethic.DB.EmbeddedImpl.ChainReader do
By default, order is chronological (ASC)
Opts:
paging_state :: binary()
paging_address :: binary()
order :: :asc | :desc
"""
@spec get_transaction_chain(
Expand All @@ -124,7 +124,7 @@ defmodule Archethic.DB.EmbeddedImpl.ChainReader do
db_path :: String.t()
) ::
{transactions_by_page :: list(Transaction.t()), more? :: boolean(),
paging_state :: nil | binary()}
paging_address :: nil | binary()}
def get_transaction_chain(address, fields, opts, db_path) do
start = System.monotonic_time()

Expand All @@ -134,7 +134,7 @@ defmodule Archethic.DB.EmbeddedImpl.ChainReader do
if File.exists?(filepath) do
fd = File.open!(filepath, [:binary, :read])

{transactions, more?, paging_state} =
{transactions, more?, paging_address} =
case Keyword.get(opts, :order, :asc) do
:asc ->
process_get_chain(fd, fields, opts, db_path)
Expand All @@ -154,7 +154,7 @@ defmodule Archethic.DB.EmbeddedImpl.ChainReader do
end
})

{transactions, more?, paging_state}
{transactions, more?, paging_address}
else
{[], false, nil}
end
Expand All @@ -176,12 +176,12 @@ defmodule Archethic.DB.EmbeddedImpl.ChainReader do
Stream.resource(
fn -> process_get_chain(fd, fields, [], db_path) end,
fn
{transactions, true, paging_state} ->
{transactions, true, paging_address} ->
next_transactions =
process_get_chain(
fd,
fields,
[paging_state: paging_state],
[paging_address: paging_address],
db_path
)

Expand Down Expand Up @@ -272,7 +272,7 @@ defmodule Archethic.DB.EmbeddedImpl.ChainReader do

defp process_get_chain(fd, fields, opts, db_path) do
# Set the file cursor position to the paging state
case Keyword.get(opts, :paging_state) do
case Keyword.get(opts, :paging_address) do
nil ->
:file.position(fd, 0)
do_process_get_chain(fd, fields)
Expand Down Expand Up @@ -310,21 +310,21 @@ defmodule Archethic.DB.EmbeddedImpl.ChainReader do
end

# Read the transactions until the nb of transactions to fullfil the page (ie. 10 transactions)
{transactions, more?, paging_state} = get_paginated_chain(fd, column_names)
{transactions, more?, paging_address} = get_paginated_chain(fd, column_names)

{transactions, more?, paging_state}
{transactions, more?, paging_address}
end

# in order to read the file sequentially in DESC (faster than random access)
# we have to determine the correct paging_state and limit_address
# we have to determine the correct paging_address and limit_address
# then we can use the process_get_chain that does the ASC read
defp process_get_chain_desc(fd, genesis_address, fields, opts, db_path) do
all_addresses_asc =
ChainIndex.list_chain_addresses(genesis_address, db_path)
|> Enum.map(&elem(&1, 0))

{nb_to_take, paging_state, more?, new_paging_state} =
case Keyword.get(opts, :paging_state) do
{nb_to_take, paging_address, more?, new_paging_address} =
case Keyword.get(opts, :paging_address) do
nil ->
chain_length = Enum.count(all_addresses_asc)

Expand All @@ -333,36 +333,36 @@ defmodule Archethic.DB.EmbeddedImpl.ChainReader do
else
idx = chain_length - 1 - @page_size

paging_state = all_addresses_asc |> Enum.at(idx)
new_paging_state = all_addresses_asc |> Enum.at(idx + 1)
paging_address = all_addresses_asc |> Enum.at(idx)
new_paging_address = all_addresses_asc |> Enum.at(idx + 1)

{@page_size, paging_state, true, new_paging_state}
{@page_size, paging_address, true, new_paging_address}
end

paging_state ->
paging_state_idx =
paging_address ->
paging_address_idx =
all_addresses_asc
|> Enum.find_index(&(&1 == paging_state))
|> Enum.find_index(&(&1 == paging_address))

if paging_state_idx <= @page_size do
{paging_state_idx, nil, false, nil}
if paging_address_idx <= @page_size do
{paging_address_idx, nil, false, nil}
else
idx = paging_state_idx - 1 - @page_size
idx = paging_address_idx - 1 - @page_size

paging_state = all_addresses_asc |> Enum.at(idx)
new_paging_state = all_addresses_asc |> Enum.at(idx + 1)
paging_address = all_addresses_asc |> Enum.at(idx)
new_paging_address = all_addresses_asc |> Enum.at(idx + 1)

{@page_size, paging_state, true, new_paging_state}
{@page_size, paging_address, true, new_paging_address}
end
end

# call the ASC function and ignore the more? and paging_state
{transactions, _more?, _paging_state} =
process_get_chain(fd, fields, [paging_state: paging_state], db_path)
# call the ASC function and ignore the more? and paging_address
{transactions, _more?, _paging_address} =
process_get_chain(fd, fields, [paging_address: paging_address], db_path)

transactions = Enum.take(transactions, nb_to_take)

{Enum.reverse(transactions), more?, new_paging_state}
{Enum.reverse(transactions), more?, new_paging_address}
end

defp get_paginated_chain(fd, fields, acc \\ []) do
Expand Down
6 changes: 3 additions & 3 deletions lib/archethic/p2p/message/get_transaction_chain.ex
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,18 @@ defmodule Archethic.P2P.Message.GetTransactionChain do
# paging_state received contains binary offset for next page, to be used for query
@spec process(__MODULE__.t(), Crypto.key()) :: TransactionList.t()
def process(%__MODULE__{address: tx_address, paging_state: paging_state, order: order}, _) do
{chain, more?, paging_state} =
{chain, more?, paging_address} =
case TransactionChain.resolve_paging_state(tx_address, paging_state, order) do
{:ok, paging_address} ->
DB.get_transaction_chain(tx_address, [], paging_state: paging_address, order: order)
DB.get_transaction_chain(tx_address, [], paging_address: paging_address, order: order)

{:error, _} ->
{[], false, nil}
end

# empty list for fields/cols to be processed
# new_page_state contains binary offset for the next page
%TransactionList{transactions: chain, paging_state: paging_state, more?: more?}
%TransactionList{transactions: chain, paging_address: paging_address, more?: more?}
end

@spec serialize(t()) :: bitstring()
Expand Down
16 changes: 10 additions & 6 deletions lib/archethic/p2p/message/transaction_list.ex
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@ defmodule Archethic.P2P.Message.TransactionList do
@moduledoc """
Represents a message with a list of transactions
"""
defstruct transactions: [], more?: false, paging_state: nil
defstruct transactions: [], more?: false, paging_address: nil

alias Archethic.TransactionChain.Transaction
alias Archethic.Utils.VarInt

@type t :: %__MODULE__{
transactions: list(Transaction.t()),
paging_state: nil | binary(),
paging_address: nil | binary(),
more?: boolean()
}

Expand All @@ -26,7 +26,11 @@ defmodule Archethic.P2P.Message.TransactionList do
<<encoded_transactions_length::binary, transaction_bin::bitstring, 0::1>>
end

def serialize(%__MODULE__{transactions: transactions, more?: true, paging_state: paging_state}) do
def serialize(%__MODULE__{
transactions: transactions,
more?: true,
paging_address: paging_address
}) do
transaction_bin =
transactions
|> Stream.map(&Transaction.serialize/1)
Expand All @@ -36,7 +40,7 @@ defmodule Archethic.P2P.Message.TransactionList do
encoded_transactions_length = Enum.count(transactions) |> VarInt.from_value()

<<encoded_transactions_length::binary, transaction_bin::bitstring, 1::1,
byte_size(paging_state)::8, paging_state::binary>>
byte_size(paging_address)::8, paging_address::binary>>
end

@spec deserialize(bitstring()) :: {t(), bitstring}
Expand All @@ -51,10 +55,10 @@ defmodule Archethic.P2P.Message.TransactionList do
rest
}

<<1::1, paging_state_size::8, paging_state::binary-size(paging_state_size),
<<1::1, paging_address_size::8, paging_address::binary-size(paging_address_size),
rest::bitstring>> ->
{
%__MODULE__{transactions: transactions, more?: true, paging_state: paging_state},
%__MODULE__{transactions: transactions, more?: true, paging_address: paging_address},
rest
}
end
Expand Down
6 changes: 3 additions & 3 deletions lib/archethic/transaction_chain.ex
Original file line number Diff line number Diff line change
Expand Up @@ -427,7 +427,7 @@ defmodule Archethic.TransactionChain do
# More to fetch from DB using paging address
{transactions, more?, next_paging_address} =
DB.get_transaction_chain(paging_address, [],
paging_state: paging_address,
paging_address: paging_address,
order: order
)

Expand Down Expand Up @@ -475,7 +475,7 @@ defmodule Archethic.TransactionChain do
# More to fetch from DB using paging address
{transactions, more?, next_paging_address} =
DB.get_transaction_chain(paging_address, [],
paging_state: paging_address,
paging_address: paging_address,
order: order
)

Expand Down Expand Up @@ -538,7 +538,7 @@ defmodule Archethic.TransactionChain do
%TransactionList{
transactions: transactions,
more?: more?,
paging_state: next_paging_address
paging_address: next_paging_address
}} ->
{transactions, more?, next_paging_address}

Expand Down
8 changes: 4 additions & 4 deletions test/archethic/bootstrap/network_init_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,7 @@ defmodule Archethic.Bootstrap.NetworkInitTest do
{:ok, %NotFound{}}

_, %GetTransactionChain{}, _ ->
{:ok, %TransactionList{transactions: [], more?: false, paging_state: nil}}
{:ok, %TransactionList{transactions: [], more?: false, paging_address: nil}}

_, %GetTransactionInputs{}, _ ->
{:ok, %TransactionInputList{inputs: []}}
Expand Down Expand Up @@ -319,7 +319,7 @@ defmodule Archethic.Bootstrap.NetworkInitTest do
{:ok, %NotFound{}}

_, %GetTransactionChain{}, _ ->
{:ok, %TransactionList{transactions: [], more?: false, paging_state: nil}}
{:ok, %TransactionList{transactions: [], more?: false, paging_address: nil}}

_, %GetTransactionInputs{}, _ ->
{:ok, %TransactionInputList{inputs: []}}
Expand Down Expand Up @@ -367,7 +367,7 @@ defmodule Archethic.Bootstrap.NetworkInitTest do
{:ok, %NotFound{}}

_, %GetTransactionChain{}, _ ->
{:ok, %TransactionList{transactions: [], more?: false, paging_state: nil}}
{:ok, %TransactionList{transactions: [], more?: false, paging_address: nil}}

_, %GetTransactionInputs{}, _ ->
{:ok, %TransactionInputList{inputs: []}}
Expand Down Expand Up @@ -414,7 +414,7 @@ defmodule Archethic.Bootstrap.NetworkInitTest do
{:ok, %NotFound{}}

_, %GetTransactionChain{}, _ ->
{:ok, %TransactionList{transactions: [], more?: false, paging_state: nil}}
{:ok, %TransactionList{transactions: [], more?: false, paging_address: nil}}

_, %GetTransactionInputs{}, _ ->
{:ok, %TransactionInputList{inputs: []}}
Expand Down
24 changes: 12 additions & 12 deletions test/archethic/db/embedded_impl_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -305,16 +305,16 @@ defmodule Archethic.DB.EmbeddedTest do
tx
end)

{page, true, paging_state} =
{page, true, paging_address} =
EmbeddedImpl.get_transaction_chain(List.last(transactions).address)

assert length(page) == 10
assert page == Enum.take(transactions, 10)
assert paging_state == List.last(page).address
assert paging_address == List.last(page).address

{page2, false, nil} =
EmbeddedImpl.get_transaction_chain(List.last(transactions).address, [],
paging_state: paging_state
paging_address: paging_address
)

assert length(page2) == 10
Expand All @@ -335,16 +335,16 @@ defmodule Archethic.DB.EmbeddedTest do
tx
end)

{page, true, paging_state} =
{page, true, paging_address} =
EmbeddedImpl.get_transaction_chain(List.last(transactions).address)

assert length(page) == 10
assert page == Enum.take(transactions, 10)
assert paging_state == List.last(page).address
assert paging_address == List.last(page).address

assert {[], false, nil} =
EmbeddedImpl.get_transaction_chain(List.last(transactions).address, [],
paging_state: :crypto.strong_rand_bytes(32)
paging_address: :crypto.strong_rand_bytes(32)
)
end
end
Expand Down Expand Up @@ -392,24 +392,24 @@ defmodule Archethic.DB.EmbeddedTest do
tx
end)

{page1, true, paging_state1} =
{page1, true, paging_address1} =
EmbeddedImpl.get_transaction_chain(List.last(transactions).address, [], order: :desc)

assert length(page1) == 10
assert paging_state1 == List.last(page1).address
assert paging_address1 == List.last(page1).address

{page2, true, paging_state2} =
{page2, true, paging_address2} =
EmbeddedImpl.get_transaction_chain(List.last(transactions).address, [],
paging_state: paging_state1,
paging_address: paging_address1,
order: :desc
)

assert length(page2) == 10
assert paging_state2 == List.last(page2).address
assert paging_address2 == List.last(page2).address

{page3, false, nil} =
EmbeddedImpl.get_transaction_chain(List.last(transactions).address, [],
paging_state: paging_state2,
paging_address: paging_address2,
order: :desc
)

Expand Down
9 changes: 6 additions & 3 deletions test/archethic/transaction_chain_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -402,9 +402,12 @@ defmodule Archethic.TransactionChainTest do
|> expect(:get_genesis_address, fn ^address3 -> genesis_address end)
|> expect(:list_chain_addresses, fn ^genesis_address -> chain_addresses end)
|> expect(:transaction_exists?, fn ^address1, _ -> true end)
|> expect(:get_transaction_chain, fn ^address1, _, [paging_state: ^address1, order: :asc] ->
{[%Transaction{address: address2}, %Transaction{address: address3}], false, nil}
end)
|> expect(
:get_transaction_chain,
fn ^address1, _, [paging_address: ^address1, order: :asc] ->
{[%Transaction{address: address2}, %Transaction{address: address3}], false, nil}
end
)

assert [^address2, ^address3] =
TransactionChain.fetch(address3, nodes, paging_state: date2)
Expand Down

0 comments on commit bddcc80

Please sign in to comment.