Skip to content

Commit

Permalink
chore: use builtin term to binary for values (#1456)
Browse files Browse the repository at this point in the history
  • Loading branch information
jyeshe committed Jul 11, 2023
1 parent 7b24e15 commit a257442
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 18 deletions.
17 changes: 11 additions & 6 deletions lib/ae_mdw/db/rocksdb_cf.ex
Original file line number Diff line number Diff line change
Expand Up @@ -173,8 +173,8 @@ defmodule AeMdw.Db.RocksDbCF do
record_type = Model.record(table)

record =
value
|> decode_value()
record_type
|> decode_value(value)
|> Tuple.insert_at(0, index)
|> Tuple.insert_at(0, record_type)

Expand All @@ -201,8 +201,8 @@ defmodule AeMdw.Db.RocksDbCF do
record_type = Model.record(table)

record =
value
|> decode_value()
record_type
|> decode_value(value)
|> Tuple.insert_at(0, index)
|> Tuple.insert_at(0, record_type)

Expand Down Expand Up @@ -274,15 +274,20 @@ defmodule AeMdw.Db.RocksDbCF do

defp encode_record_value({_record_name, _key, nil}), do: ""

defp encode_record_value({:contract_log, _key, ext_contract, args, data, hash}) do
:erlang.term_to_binary({ext_contract, args, data, hash})
end

defp encode_record_value(record) do
record
|> Tuple.delete_at(0)
|> Tuple.delete_at(0)
|> :sext.encode()
end

defp decode_value(""), do: {nil}
defp decode_value(value), do: :sext.decode(value)
defp decode_value(_type, ""), do: {nil}
defp decode_value(:contract_log, value), do: :erlang.binary_to_term(value)
defp decode_value(_type, value), do: :sext.decode(value)

defp do_iterator_move(it, action) do
case :rocksdb.iterator_move(it, action) do
Expand Down
1 change: 0 additions & 1 deletion priv/migrations/20230629130000_contract_call_entrypoint.ex
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@ defmodule AeMdw.Migrations.ContractCallEntrypoint do
write_mutations =
tasks
|> Task.await_many(60_000 * 30)
|> IO.inspect()
|> List.flatten()

_state = State.commit(state, write_mutations)
Expand Down
55 changes: 44 additions & 11 deletions priv/migrations/20230705224000_event_logs_hash.ex
Original file line number Diff line number Diff line change
@@ -1,22 +1,46 @@
defmodule AeMdw.Migrations.EventLogsHash do
# credo:disable-for-this-file
@moduledoc """
Reindex logs moving the hash out of the key.
Reindex logs to move the hash out of the key and use built-in encoding for the value part of the records.
"""

require Logger
alias AeMdw.Db.RocksDb
alias AeMdw.Collection
alias AeMdw.Db.Model
alias AeMdw.Db.WriteMutation
alias AeMdw.Db.DeleteKeysMutation
alias AeMdw.Db.State

require Model
require Logger

@range_size 500_000
@range_size 200_000

@dialyzer :no_return

defmodule DeleteKeysMutation do
@moduledoc false
alias AeMdw.Db.Model
alias AeMdw.Db.State
alias AeMdw.Db.RocksDb

require Model

@derive AeMdw.Db.Mutation
defstruct [:args]

def new(args) do
%__MODULE__{args: args}
end

def execute(%__MODULE__{args: [log_key, data_log_key, idx_log_key]}, state) do
txn = Map.get(state.store, :txn)
:ok = RocksDb.delete(txn, Model.ContractLog, :sext.encode(log_key))
:ok = RocksDb.delete(txn, Model.DataContractLog, :sext.encode(data_log_key))
:ok = RocksDb.delete(txn, Model.IdxContractLog, :sext.encode(idx_log_key))
state
end
end

@spec run(State.t(), boolean()) :: {:ok, non_neg_integer()}
def run(state, _from_start?) do
case State.prev(state, Model.Tx, nil) do
Expand Down Expand Up @@ -71,8 +95,7 @@ defmodule AeMdw.Migrations.EventLogsHash do
|> Enum.flat_map(fn {call_txi, log_idx, create_txi, evt_hash} = idx_log_key ->
log_key = {create_txi, call_txi, evt_hash, log_idx}

{:contract_log, ^log_key, ext_contract, args, data} =
State.fetch!(state, Model.ContractLog, log_key)
{:contract_log, ^log_key, ext_contract, args, data} = fetch_old!(log_key)

m_log =
Model.contract_log(
Expand All @@ -86,12 +109,10 @@ defmodule AeMdw.Migrations.EventLogsHash do
m_data_log = Model.data_contract_log(index: {data, call_txi, create_txi, log_idx})
m_idx_log = Model.idx_contract_log(index: {call_txi, log_idx, create_txi})

data_log_key = {data, call_txi, create_txi, evt_hash, log_idx}

[
DeleteKeysMutation.new(%{
Model.ContractLog => [log_key],
Model.DataContractLog => [{data, call_txi, create_txi, evt_hash, log_idx}],
Model.IdxContractLog => [idx_log_key]
}),
DeleteKeysMutation.new([log_key, data_log_key, idx_log_key]),
WriteMutation.new(Model.ContractLog, m_log),
WriteMutation.new(Model.DataContractLog, m_data_log),
WriteMutation.new(Model.IdxContractLog, m_idx_log)
Expand All @@ -109,4 +130,16 @@ defmodule AeMdw.Migrations.EventLogsHash do
Logger.info(msg)
IO.puts(msg)
end

defp fetch_old!(index) do
key = :sext.encode(index)

{:ok, value} = RocksDb.get(Model.ContractLog, key)
record_type = Model.record(Model.ContractLog)

value
|> :sext.decode()
|> Tuple.insert_at(0, index)
|> Tuple.insert_at(0, record_type)
end
end

0 comments on commit a257442

Please sign in to comment.