Skip to content

Commit 2095502

Browse files
authored
feat(consensus): persist standalone WAL with crash-safe replay (#3763)
* feat(consensus): persist standalone WAL with crash-safe replay * fix: handle WAL file close errors * test: cover WAL record and prune watermark decode paths * fix(db/memory): avoid panic when temp path creation fails * refactor: use constant for estimatedRecordBytes * refactor: pass WalRecordEnvelope by reference * refactor: remove impossible WAL payload size check * refactor: remove impossible WAL payload nil checks * refactor: pass WAL proposal value by reference * fix: clarify remaining bytes error * refactor: rename consensus db package to walstore * refactor: combine duplicate WAL number checks * refactor: pass WAL uint64 arrays by reference * refactor: remove redundant WAL entry checks * test: assert memory DB copy path after copy * refactor: clarify WAL batch record indexing
1 parent 81d1e20 commit 2095502

39 files changed

Lines changed: 3494 additions & 479 deletions

consensus/consensus.go

Lines changed: 56 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55

66
"github.com/NethermindEth/juno/blockchain"
77
"github.com/NethermindEth/juno/builder"
8-
consensusDB "github.com/NethermindEth/juno/consensus/db"
98
"github.com/NethermindEth/juno/consensus/driver"
109
"github.com/NethermindEth/juno/consensus/p2p"
1110
"github.com/NethermindEth/juno/consensus/p2p/config"
@@ -16,6 +15,7 @@ import (
1615
"github.com/NethermindEth/juno/consensus/tendermint"
1716
"github.com/NethermindEth/juno/consensus/types"
1817
"github.com/NethermindEth/juno/consensus/votecounter"
18+
"github.com/NethermindEth/juno/consensus/walstore"
1919
"github.com/NethermindEth/juno/core/felt"
2020
"github.com/NethermindEth/juno/db"
2121
"github.com/NethermindEth/juno/p2p/sync"
@@ -33,6 +33,15 @@ type ConsensusServices struct {
3333
CommitListener driver.CommitListener[starknet.Value, starknet.Hash]
3434
}
3535

36+
type initOptions struct {
37+
wrapWALStore func(
38+
walstore.TendermintWALStore[starknet.Value, starknet.Hash, starknet.Address],
39+
) walstore.TendermintWALStore[starknet.Value, starknet.Hash, starknet.Address]
40+
wrapBroadcasters func(
41+
p2p.Broadcasters[starknet.Value, starknet.Hash, starknet.Address],
42+
) p2p.Broadcasters[starknet.Value, starknet.Hash, starknet.Address]
43+
}
44+
3645
func Init(
3746
host host.Host,
3847
logger *log.ZapLogger,
@@ -45,16 +54,53 @@ func Init(
4554
timeoutFn driver.TimeoutFn,
4655
bootstrapPeersFn func() []peer.AddrInfo,
4756
compiler compiler.Compiler,
57+
) (ConsensusServices, error) {
58+
return initWithOptions(
59+
host,
60+
logger,
61+
database,
62+
blockchain,
63+
vm,
64+
blockFetcher,
65+
nodeAddress,
66+
validators,
67+
timeoutFn,
68+
bootstrapPeersFn,
69+
compiler,
70+
initOptions{},
71+
)
72+
}
73+
74+
func initWithOptions(
75+
host host.Host,
76+
logger *log.ZapLogger,
77+
database db.KeyValueStore,
78+
blockchain *blockchain.Blockchain,
79+
vm vm.VM,
80+
blockFetcher *sync.BlockFetcher,
81+
nodeAddress *starknet.Address,
82+
validators votecounter.Validators[starknet.Address],
83+
timeoutFn driver.TimeoutFn,
84+
bootstrapPeersFn func() []peer.AddrInfo,
85+
compiler compiler.Compiler,
86+
options initOptions,
4887
) (ConsensusServices, error) {
4988
chainHeight, err := blockchain.Height()
5089
if err != nil && !errors.Is(err, db.ErrKeyNotFound) {
5190
return ConsensusServices{}, err
5291
}
5392
currentHeight := types.Height(chainHeight + 1)
54-
55-
tendermintDB := consensusDB.NewTendermintDB[
56-
starknet.Value, starknet.Hash, starknet.Address,
93+
tendermintWALStore, err := walstore.NewTendermintWALStore[
94+
starknet.Value,
95+
starknet.Hash,
96+
starknet.Address,
5797
](database)
98+
if err != nil {
99+
return ConsensusServices{}, err
100+
}
101+
if options.wrapWALStore != nil {
102+
tendermintWALStore = options.wrapWALStore(tendermintWALStore)
103+
}
58104

59105
executor := builder.NewExecutor(blockchain, vm, logger, false, false)
60106
builder := builder.New(blockchain, executor)
@@ -77,13 +123,17 @@ func Init(
77123
commitListener := driver.NewCommitListener(logger, &proposalStore, proposer, p2p)
78124

79125
messageExtractor := consensusSync.New(validators, toValue, &proposalStore)
126+
broadcasters := p2p.Broadcasters()
127+
if options.wrapBroadcasters != nil {
128+
broadcasters = options.wrapBroadcasters(broadcasters)
129+
}
80130

81131
driver := driver.New(
82132
logger,
83-
tendermintDB,
133+
tendermintWALStore,
84134
stateMachine,
85135
commitListener,
86-
p2p.Broadcasters(),
136+
broadcasters,
87137
p2p.Listeners(),
88138
blockFetcher,
89139
&messageExtractor,

consensus/consensus_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ func writeBlock(
206206
require.NoError(t, err)
207207
require.NoError(t, bc.Store(committedBlock.Block, commitments, committedBlock.StateUpdate, committedBlock.NewClasses))
208208

209-
close(committedBlock.Persisted)
209+
committedBlock.Persisted <- nil
210210

211211
commit := commit{
212212
nodeIndex: index,

consensus/db/buckets_consensus.go

Lines changed: 0 additions & 20 deletions
This file was deleted.

consensus/db/buckets_consensus_enumer.go

Lines changed: 0 additions & 74 deletions
This file was deleted.

consensus/db/db.go

Lines changed: 0 additions & 162 deletions
This file was deleted.

0 commit comments

Comments
 (0)