@@ -2,6 +2,7 @@ defmodule LambdaEthereumConsensus.Store.StateDb do
2
2
@ moduledoc """
3
3
Beacon node state storage.
4
4
"""
5
+ require Logger
5
6
alias LambdaEthereumConsensus.Store.Db
6
7
alias LambdaEthereumConsensus.Store.Utils
7
8
alias Types.BeaconState
@@ -30,30 +31,35 @@ defmodule LambdaEthereumConsensus.Store.StateDb do
30
31
Db . put ( slothash_key_block , block_root )
31
32
end
32
33
34
+ @ spec prune_states_older_than ( non_neg_integer ( ) ) :: :ok | { :error , String . t ( ) } | :not_found
33
35
def prune_states_older_than ( slot ) do
36
+ Logger . info ( "[StateDb] Pruning started." , slot: slot )
34
37
last_finalized_key = slot |> root_by_slot_key ( )
35
38
36
39
with { :ok , it } <- Db . iterate ( ) ,
37
40
{ :ok , @ stateslot_prefix <> _slot , _value } <-
38
41
Exleveldb . iterator_move ( it , last_finalized_key ) ,
39
42
{ :ok , slots_to_remove } <- get_slots_to_remove ( it ) ,
40
43
:ok <- Exleveldb . iterator_close ( it ) do
41
- slots_to_remove |> Enum . map ( & remove_by_slot / 1 )
44
+ slots_to_remove |> Enum . each ( & remove_state_by_slot / 1 )
45
+ Logger . info ( "[StateDb] Pruning finished. #{ length ( slots_to_remove ) } slots removed." )
42
46
end
43
47
end
44
48
49
+ @ spec get_slots_to_remove ( list ( non_neg_integer ( ) ) , :eleveldb . itr_ref ( ) ) ::
50
+ { :ok , list ( non_neg_integer ( ) ) }
45
51
defp get_slots_to_remove ( slots_to_remove \\ [ ] , iterator ) do
46
52
case Exleveldb . iterator_move ( iterator , :prev ) do
47
- { :ok , @ stateslot_prefix <> slot , _root } ->
53
+ { :ok , @ stateslot_prefix <> << slot :: unsigned - size ( 64 ) >> , _root } ->
48
54
[ slot | slots_to_remove ] |> get_slots_to_remove ( iterator )
49
55
50
56
_ ->
51
57
{ :ok , slots_to_remove }
52
58
end
53
59
end
54
60
55
- defp remove_by_slot ( binary_slot ) do
56
- slot = :binary . decode_unsigned ( binary_slot )
61
+ @ spec remove_state_by_slot ( non_neg_integer ( ) ) :: :ok | :not_found
62
+ defp remove_state_by_slot ( slot ) do
57
63
key_slot = root_by_slot_key ( slot )
58
64
59
65
with { :ok , block_root } <- Db . get ( key_slot ) ,
0 commit comments