Skip to content

Commit d7fbf79

Browse files
committed
Merge branch 'main' into alex/adr023_ha-failover_raft8
* main: fix: Fail fast when executor ahead (#2966) feat(block): async epoch fetching (#2952) perf: tune badger defaults and add db bench (#2950)
2 parents 490b286 + 6d132bf commit d7fbf79

File tree

26 files changed

+1655
-268
lines changed

26 files changed

+1655
-268
lines changed

.mockery.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,10 @@ packages:
8787
dir: ./pkg/da/jsonrpc/mocks
8888
pkgname: mocks
8989
filename: header_module_mock.go
90+
github.com/evstack/ev-node/block:
91+
interfaces:
92+
ForcedInclusionRetriever:
93+
config:
94+
dir: ./pkg/sequencers/common
95+
pkgname: common
96+
filename: forced_inclusion_retriever_mock.go

apps/evm/cmd/run.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,7 @@ func createSequencer(
161161
return nil, fmt.Errorf("based sequencer mode requires aggregator mode to be enabled")
162162
}
163163

164-
fiRetriever := block.NewForcedInclusionRetriever(daClient, logger, genesis.DAStartHeight, genesis.DAEpochForcedInclusion)
165-
basedSeq, err := based.NewBasedSequencer(fiRetriever, datastore, genesis, logger)
164+
basedSeq, err := based.NewBasedSequencer(daClient, nodeConfig, datastore, genesis, logger)
166165
if err != nil {
167166
return nil, fmt.Errorf("failed to create based sequencer: %w", err)
168167
}
@@ -179,8 +178,8 @@ func createSequencer(
179178
logger,
180179
datastore,
181180
daClient,
181+
nodeConfig,
182182
[]byte(genesis.ChainID),
183-
nodeConfig.Node.BlockTime.Duration,
184183
1000,
185184
genesis,
186185
)

apps/grpc/cmd/run.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,7 @@ func createSequencer(
120120
return nil, fmt.Errorf("based sequencer mode requires aggregator mode to be enabled")
121121
}
122122

123-
fiRetriever := block.NewForcedInclusionRetriever(daClient, logger, genesis.DAStartHeight, genesis.DAEpochForcedInclusion)
124-
basedSeq, err := based.NewBasedSequencer(fiRetriever, datastore, genesis, logger)
123+
basedSeq, err := based.NewBasedSequencer(daClient, nodeConfig, datastore, genesis, logger)
125124
if err != nil {
126125
return nil, fmt.Errorf("failed to create based sequencer: %w", err)
127126
}
@@ -138,8 +137,8 @@ func createSequencer(
138137
logger,
139138
datastore,
140139
daClient,
140+
nodeConfig,
141141
[]byte(genesis.ChainID),
142-
nodeConfig.Node.BlockTime.Duration,
143142
1000,
144143
genesis,
145144
)

apps/testapp/cmd/run.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,7 @@ func createSequencer(
122122
return nil, fmt.Errorf("based sequencer mode requires aggregator mode to be enabled")
123123
}
124124

125-
fiRetriever := block.NewForcedInclusionRetriever(daClient, logger, genesis.DAStartHeight, genesis.DAEpochForcedInclusion)
126-
basedSeq, err := based.NewBasedSequencer(fiRetriever, datastore, genesis, logger)
125+
basedSeq, err := based.NewBasedSequencer(daClient, nodeConfig, datastore, genesis, logger)
127126
if err != nil {
128127
return nil, fmt.Errorf("failed to create based sequencer: %w", err)
129128
}
@@ -140,8 +139,8 @@ func createSequencer(
140139
logger,
141140
datastore,
142141
daClient,
142+
nodeConfig,
143143
[]byte(genesis.ChainID),
144-
nodeConfig.Node.BlockTime.Duration,
145144
1000,
146145
genesis,
147146
)

block/internal/common/replay.go

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -67,15 +67,11 @@ func (s *Replayer) SyncToHeight(ctx context.Context, targetHeight uint64) error
6767
Uint64("exec_layer_height", execHeight).
6868
Msg("execution layer height check")
6969

70-
// If execution layer is ahead, skip syncing and continue. This can happen if execution
71-
// progressed independently (e.g. after manual intervention). We log it for visibility but
72-
// do not treat it as fatal.
70+
// If execution layer is ahead, we cannot proceed safely as this indicates state divergence.
71+
// The execution layer must be rolled back before the node can continue.
7372
if execHeight > targetHeight {
74-
s.logger.Warn().
75-
Uint64("target_height", targetHeight).
76-
Uint64("exec_layer_height", execHeight).
77-
Msg("execution layer is ahead of target height - skipping replay")
78-
return nil
73+
return fmt.Errorf("execution layer height (%d) ahead of target height (%d): manually rollback execution layer to height %d",
74+
execHeight, targetHeight, targetHeight)
7975
}
8076

8177
// If execution layer is behind, sync the missing blocks

block/internal/common/replay_test.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,15 +135,16 @@ func TestReplayer_SyncToHeight_ExecutorAhead(t *testing.T) {
135135

136136
syncer := NewReplayer(mockStore, mockExec, gen, logger)
137137

138-
// Setup: target height is 100, execution layer is at 101 (unexpected!)
138+
// Setup: execution layer is ahead of target (indicates state divergence)
139139
targetHeight := uint64(100)
140140
execHeight := uint64(101)
141141

142142
mockExec.On("GetLatestHeight", mock.Anything).Return(execHeight, nil)
143143

144-
// Execute sync - should just log and continue without error
144+
// Should return error to prevent proceeding with divergent state
145145
err := syncer.SyncToHeight(ctx, targetHeight)
146-
require.NoError(t, err)
146+
require.Error(t, err)
147+
require.Contains(t, err.Error(), "ahead of target height")
147148

148149
// No replay should be attempted
149150
mockExec.AssertNotCalled(t, "ExecuteTxs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything)

0 commit comments

Comments
 (0)