Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion block/components.go
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,11 @@ func NewSyncComponents(
blockOpts BlockOptions,
raftNode common.RaftNode,
) (*Components, error) {
cacheManager, err := cache.NewManager(config, store, logger)
newCacheManager := cache.NewManager
if daClient == nil {
newCacheManager = cache.NewManagerWithoutDAInclusionRestore
}
cacheManager, err := newCacheManager(config, store, logger)
if err != nil {
return nil, fmt.Errorf("failed to create cache manager: %w", err)
}
Expand Down
57 changes: 57 additions & 0 deletions block/components_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import (
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"

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

func TestNewSyncComponents_WithoutDADoesNotRestoreDAInclusionCache(t *testing.T) {
daConfig := config.DefaultConfig()
daConfig.DA.Address = "ws://da.example.invalid"
require.True(t, daConfig.DAEnabled())

rootDir := t.TempDir()
database, err := store.NewDefaultKVStore(rootDir, "data", "ev-node")
require.NoError(t, err)
diskStore := store.New(store.NewEvNodeKVStore(database))

previousDAManager, err := cache.NewManager(daConfig, diskStore, zerolog.Nop())
require.NoError(t, err)
previousDAManager.SetHeaderDAIncluded("persisted-da-header", 9001, 42)
previousDAManager.SetDataDAIncluded("persisted-da-data", 9001, 42)
require.NoError(t, previousDAManager.SaveToStore())
require.NoError(t, diskStore.Close())

reopenedDatabase, err := store.NewDefaultKVStore(rootDir, "data", "ev-node")
require.NoError(t, err)
reopenedStore := store.New(store.NewEvNodeKVStore(reopenedDatabase))
t.Cleanup(func() {
require.NoError(t, reopenedStore.Close())
})

p2pConfig := config.DefaultConfig()
require.False(t, p2pConfig.DAEnabled())

components, err := NewSyncComponents(
p2pConfig,
genesis.Genesis{
ChainID: "da-to-p2p-repro",
InitialHeight: 1,
StartTime: time.Now(),
ProposerAddress: []byte("test-proposer"),
},
reopenedStore,
testmocks.NewMockExecutor(t),
nil,
extmocks.NewMockStore[*types.P2PSignedHeader](t),
extmocks.NewMockStore[*types.P2PData](t),
noopDAHintAppender{},
noopDAHintAppender{},
zerolog.Nop(),
NopMetrics(),
DefaultBlockOptions(),
nil,
)
require.NoError(t, err)
require.Nil(t, components.Submitter)

_, headerLoaded := components.Cache.GetHeaderDAIncludedByHeight(42)
_, dataLoaded := components.Cache.GetDataDAIncludedByHeight(42)
require.False(t, headerLoaded, "P2P-only startup must not restore persisted DA header state")
require.False(t, dataLoaded, "P2P-only startup must not restore persisted DA data state")
}

func TestNewAggregatorComponents_Creation(t *testing.T) {
ds := sync.MutexWrap(datastore.NewMapDatastore())
memStore := store.New(ds)
Expand Down
11 changes: 10 additions & 1 deletion block/internal/cache/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,15 @@ type implementation struct {

// NewManager creates a new Manager, restoring or clearing persisted state as configured.
func NewManager(cfg config.Config, st store.Store, logger zerolog.Logger) (Manager, error) {
return newManager(cfg, st, logger, true)
}

// NewManagerWithoutDAInclusionRestore creates a Manager without restoring persisted DA inclusion state.
func NewManagerWithoutDAInclusionRestore(cfg config.Config, st store.Store, logger zerolog.Logger) (Manager, error) {
return newManager(cfg, st, logger, false)
}

func newManager(cfg config.Config, st store.Store, logger zerolog.Logger, restoreDAInclusion bool) (Manager, error) {
headerCache := NewCache(st, HeaderDAIncludedPrefix)
dataCache := NewCache(st, DataDAIncludedPrefix)

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