Skip to content

Commit 17978c0

Browse files
committed
fix: skip DA cache restore for P2P-only nodes
1 parent ec029e0 commit 17978c0

3 files changed

Lines changed: 72 additions & 2 deletions

File tree

block/components.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,11 @@ func NewSyncComponents(
150150
blockOpts BlockOptions,
151151
raftNode common.RaftNode,
152152
) (*Components, error) {
153-
cacheManager, err := cache.NewManager(config, store, logger)
153+
newCacheManager := cache.NewManager
154+
if daClient == nil {
155+
newCacheManager = cache.NewManagerWithoutDAInclusionRestore
156+
}
157+
cacheManager, err := newCacheManager(config, store, logger)
154158
if err != nil {
155159
return nil, fmt.Errorf("failed to create cache manager: %w", err)
156160
}

block/components_test.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"github.com/stretchr/testify/mock"
1717
"github.com/stretchr/testify/require"
1818

19+
"github.com/evstack/ev-node/block/internal/cache"
1920
coresequencer "github.com/evstack/ev-node/core/sequencer"
2021
"github.com/evstack/ev-node/pkg/config"
2122
datypes "github.com/evstack/ev-node/pkg/da/types"
@@ -165,6 +166,62 @@ func TestNewSyncComponents_WithoutDA(t *testing.T) {
165166
assert.Nil(t, components.Submitter)
166167
}
167168

169+
func TestNewSyncComponents_WithoutDADoesNotRestoreDAInclusionCache(t *testing.T) {
170+
daConfig := config.DefaultConfig()
171+
daConfig.DA.Address = "ws://da.example.invalid"
172+
require.True(t, daConfig.DAEnabled())
173+
174+
rootDir := t.TempDir()
175+
database, err := store.NewDefaultKVStore(rootDir, "data", "ev-node")
176+
require.NoError(t, err)
177+
diskStore := store.New(store.NewEvNodeKVStore(database))
178+
179+
previousDAManager, err := cache.NewManager(daConfig, diskStore, zerolog.Nop())
180+
require.NoError(t, err)
181+
previousDAManager.SetHeaderDAIncluded("persisted-da-header", 9001, 42)
182+
previousDAManager.SetDataDAIncluded("persisted-da-data", 9001, 42)
183+
require.NoError(t, previousDAManager.SaveToStore())
184+
require.NoError(t, diskStore.Close())
185+
186+
reopenedDatabase, err := store.NewDefaultKVStore(rootDir, "data", "ev-node")
187+
require.NoError(t, err)
188+
reopenedStore := store.New(store.NewEvNodeKVStore(reopenedDatabase))
189+
t.Cleanup(func() {
190+
require.NoError(t, reopenedStore.Close())
191+
})
192+
193+
p2pConfig := config.DefaultConfig()
194+
require.False(t, p2pConfig.DAEnabled())
195+
196+
components, err := NewSyncComponents(
197+
p2pConfig,
198+
genesis.Genesis{
199+
ChainID: "da-to-p2p-repro",
200+
InitialHeight: 1,
201+
StartTime: time.Now(),
202+
ProposerAddress: []byte("test-proposer"),
203+
},
204+
reopenedStore,
205+
testmocks.NewMockExecutor(t),
206+
nil,
207+
extmocks.NewMockStore[*types.P2PSignedHeader](t),
208+
extmocks.NewMockStore[*types.P2PData](t),
209+
noopDAHintAppender{},
210+
noopDAHintAppender{},
211+
zerolog.Nop(),
212+
NopMetrics(),
213+
DefaultBlockOptions(),
214+
nil,
215+
)
216+
require.NoError(t, err)
217+
require.Nil(t, components.Submitter)
218+
219+
_, headerLoaded := components.Cache.GetHeaderDAIncludedByHeight(42)
220+
_, dataLoaded := components.Cache.GetDataDAIncludedByHeight(42)
221+
require.False(t, headerLoaded, "P2P-only startup must not restore persisted DA header state")
222+
require.False(t, dataLoaded, "P2P-only startup must not restore persisted DA data state")
223+
}
224+
168225
func TestNewAggregatorComponents_Creation(t *testing.T) {
169226
ds := sync.MutexWrap(datastore.NewMapDatastore())
170227
memStore := store.New(ds)

block/internal/cache/manager.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,15 @@ type implementation struct {
9393

9494
// NewManager creates a new Manager, restoring or clearing persisted state as configured.
9595
func NewManager(cfg config.Config, st store.Store, logger zerolog.Logger) (Manager, error) {
96+
return newManager(cfg, st, logger, true)
97+
}
98+
99+
// NewManagerWithoutDAInclusionRestore creates a Manager without restoring persisted DA inclusion state.
100+
func NewManagerWithoutDAInclusionRestore(cfg config.Config, st store.Store, logger zerolog.Logger) (Manager, error) {
101+
return newManager(cfg, st, logger, false)
102+
}
103+
104+
func newManager(cfg config.Config, st store.Store, logger zerolog.Logger, restoreDAInclusion bool) (Manager, error) {
96105
headerCache := NewCache(st, HeaderDAIncludedPrefix)
97106
dataCache := NewCache(st, DataDAIncludedPrefix)
98107

@@ -121,7 +130,7 @@ func NewManager(cfg config.Config, st store.Store, logger zerolog.Logger) (Manag
121130
if err := impl.ClearFromStore(); err != nil {
122131
logger.Warn().Err(err).Msg("failed to clear cache from disk, starting with empty cache")
123132
}
124-
} else {
133+
} else if restoreDAInclusion {
125134
// Restore existing cache from store
126135
if err := impl.RestoreFromStore(); err != nil {
127136
logger.Warn().Err(err).Msg("failed to load cache from disk, starting with empty cache")

0 commit comments

Comments
 (0)