Skip to content

Commit

Permalink
chore: use builtin term to binary for values
Browse files Browse the repository at this point in the history
  • Loading branch information
jyeshe committed Jul 10, 2023
1 parent d2ba17a commit d7e8c65
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 17 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
59 changes: 49 additions & 10 deletions priv/migrations/20230705224000_event_logs_hash.ex
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,49 @@ defmodule AeMdw.Migrations.EventLogsHash do
Reindex logs moving the hash out of the key.
"""

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]

@opaque t() :: %__MODULE__{
args: list()
}

@spec new(list()) :: t()
def new(args) do
%__MODULE__{args: args}
end

@spec execute(t(), State.t()) :: State.t()

Check warning on line 40 in priv/migrations/20230705224000_event_logs_hash.ex

View workflow job for this annotation

GitHub Actions / Dialyzer

invalid_contract

Invalid type specification for function execute.
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 +101,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 +115,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 +136,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 d7e8c65

Please sign in to comment.