diff --git a/blocksync/reactor_test.go b/blocksync/reactor_test.go index 0ab127b53..bf993c2e6 100644 --- a/blocksync/reactor_test.go +++ b/blocksync/reactor_test.go @@ -76,7 +76,7 @@ func newReactor( stateStore := sm.NewStore(stateDB, sm.StoreOptions{ DiscardABCIResponses: false, }) - blockStore := store.NewBlockStore(blockDB) + blockStore := store.NewBlockStore(blockDB, store.BlockStoreOptions{}) state, err := stateStore.LoadFromDBOrGenesisDoc(genDoc) if err != nil { diff --git a/cmd/tendermint/commands/rollback.go b/cmd/tendermint/commands/rollback.go index c232c0b8d..8a14c9558 100644 --- a/cmd/tendermint/commands/rollback.go +++ b/cmd/tendermint/commands/rollback.go @@ -78,7 +78,7 @@ func loadStateAndBlockStore(config *cfg.Config) (*store.BlockStore, state.Store, if err != nil { return nil, nil, err } - blockStore := store.NewBlockStore(blockStoreDB) + blockStore := store.NewBlockStore(blockStoreDB, store.BlockStoreOptions{}) if !os.FileExists(filepath.Join(config.DBDir(), "state.db")) { return nil, nil, fmt.Errorf("no statestore found in %v", config.DBDir()) diff --git a/consensus/byzantine_test.go b/consensus/byzantine_test.go index 850584a8c..21c41d190 100644 --- a/consensus/byzantine_test.go +++ b/consensus/byzantine_test.go @@ -63,7 +63,7 @@ func TestByzantinePrevoteEquivocation(t *testing.T) { app.InitChain(abci.RequestInitChain{Validators: vals}) blockDB := dbm.NewMemDB() - blockStore := store.NewBlockStore(blockDB) + blockStore := store.NewBlockStore(blockDB, store.BlockStoreOptions{}) mtx := new(tmsync.Mutex) // one for mempool, one for consensus diff --git a/consensus/common_test.go b/consensus/common_test.go index fee218198..0fbe1b8f7 100644 --- a/consensus/common_test.go +++ b/consensus/common_test.go @@ -392,7 +392,7 @@ func newStateWithConfigAndBlockStore( blockDB dbm.DB, ) *State { // Get BlockStore - blockStore := store.NewBlockStore(blockDB) + blockStore := store.NewBlockStore(blockDB, store.BlockStoreOptions{}) // one for mempool, one for consensus mtx := new(tmsync.Mutex) diff --git a/consensus/reactor_test.go b/consensus/reactor_test.go index f0cdc5f9d..85c9875cf 100644 --- a/consensus/reactor_test.go +++ b/consensus/reactor_test.go @@ -155,7 +155,7 @@ func TestReactorWithEvidence(t *testing.T) { // css[i] = newStateWithConfig(thisConfig, state, privVals[i], app) blockDB := dbm.NewMemDB() - blockStore := store.NewBlockStore(blockDB) + blockStore := store.NewBlockStore(blockDB, store.BlockStoreOptions{}) mtx := new(tmsync.Mutex) memplMetrics := mempl.NopMetrics() diff --git a/consensus/replay_file.go b/consensus/replay_file.go index c342c32bd..f821eed29 100644 --- a/consensus/replay_file.go +++ b/consensus/replay_file.go @@ -290,7 +290,7 @@ func newConsensusStateForReplay(config cfg.BaseConfig, csConfig *cfg.ConsensusCo if err != nil { tmos.Exit(err.Error()) } - blockStore := store.NewBlockStore(blockStoreDB) + blockStore := store.NewBlockStore(blockStoreDB, store.BlockStoreOptions{}) // Get State stateDB, err := dbm.NewDB("state", dbType, config.DBDir()) diff --git a/consensus/wal_generator.go b/consensus/wal_generator.go index 96a0d485c..70fb80263 100644 --- a/consensus/wal_generator.go +++ b/consensus/wal_generator.go @@ -60,7 +60,7 @@ func WALGenerateNBlocks(t *testing.T, wr io.Writer, numBlocks int) (err error) { t.Error(err) } - blockStore := store.NewBlockStore(blockStoreDB) + blockStore := store.NewBlockStore(blockStoreDB, store.BlockStoreOptions{}) proxyApp := proxy.NewAppConns(proxy.NewLocalClientCreator(app), proxy.NopMetrics()) proxyApp.SetLogger(logger.With("module", "proxy")) diff --git a/evidence/mocks/block_store.go b/evidence/mocks/block_store.go index e61c4e0ae..8872a7bfb 100644 --- a/evidence/mocks/block_store.go +++ b/evidence/mocks/block_store.go @@ -64,7 +64,7 @@ type mockConstructorTestingTNewBlockStore interface { } // NewBlockStore creates a new instance of BlockStore. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewBlockStore(t mockConstructorTestingTNewBlockStore) *BlockStore { +func NewBlockStore(t mockConstructorTestingTNewBlockStore, store.BlockStoreOptions{}) *BlockStore { mock := &BlockStore{} mock.Mock.Test(t) diff --git a/evidence/pool_test.go b/evidence/pool_test.go index 8283bb2f9..3972e6dcf 100644 --- a/evidence/pool_test.go +++ b/evidence/pool_test.go @@ -411,7 +411,7 @@ func initializeValidatorState(privVal types.PrivValidator, height int64) sm.Stor // initializeBlockStore creates a block storage and populates it w/ a dummy // block at +height+. func initializeBlockStore(db dbm.DB, state sm.State, valAddr []byte) (*store.BlockStore, error) { - blockStore := store.NewBlockStore(db) + blockStore := store.NewBlockStore(db, store.BlockStoreOptions{}) for i := int64(1); i <= state.LastBlockHeight; i++ { lastCommit := makeCommit(i-1, valAddr) diff --git a/node/node_test.go b/node/node_test.go index 4fdf63f3f..6d5385ab1 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -295,7 +295,7 @@ func TestCreateProposalBlock(t *testing.T) { // Make EvidencePool evidenceDB := dbm.NewMemDB() - blockStore := store.NewBlockStore(dbm.NewMemDB()) + blockStore := store.NewBlockStore(dbm.NewMemDB(), store.BlockStoreOptions{}) evidencePool, err := evidence.NewPool(evidenceDB, stateStore, blockStore) require.NoError(t, err) evidencePool.SetLogger(logger) @@ -402,7 +402,7 @@ func TestMaxProposalBlockSize(t *testing.T) { ) } - blockStore := store.NewBlockStore(dbm.NewMemDB()) + blockStore := store.NewBlockStore(dbm.NewMemDB(), store.BlockStoreOptions{}) // fill the mempool with one txs just below the maximum size txLength := int(types.MaxDataBytesNoEvidence(maxBytes, 1)) diff --git a/node/setup.go b/node/setup.go index 5bada8b6f..2fc815fd7 100644 --- a/node/setup.go +++ b/node/setup.go @@ -130,7 +130,7 @@ func initDBs(config *cfg.Config, dbProvider DBProvider) (blockStore *store.Block if err != nil { return } - blockStore = store.NewBlockStore(blockStoreDB) + blockStore = store.NewBlockStore(blockStoreDB, store.BlockStoreOptions{}) stateDB, err = dbProvider(&DBContext{"state", config}) if err != nil { diff --git a/state/execution_test.go b/state/execution_test.go index 8e1c69d63..e7c73db32 100644 --- a/state/execution_test.go +++ b/state/execution_test.go @@ -50,7 +50,7 @@ func TestApplyBlock(t *testing.T) { stateStore := sm.NewStore(stateDB, sm.StoreOptions{ DiscardABCIResponses: false, }) - blockStore := store.NewBlockStore(dbm.NewMemDB()) + blockStore := store.NewBlockStore(dbm.NewMemDB(), store.BlockStoreOptions{}) mp := &mpmocks.Mempool{} mp.On("Lock").Return() @@ -235,7 +235,7 @@ func TestBeginBlockByzantineValidators(t *testing.T) { mock.Anything, mock.Anything).Return(nil) - blockStore := store.NewBlockStore(dbm.NewMemDB()) + blockStore := store.NewBlockStore(dbm.NewMemDB(), store.BlockStoreOptions{}) blockExec := sm.NewBlockExecutor(stateStore, log.TestingLogger(), proxyApp.Consensus(), mp, evpool, blockStore) @@ -273,7 +273,7 @@ func TestProcessProposal(t *testing.T) { stateStore := sm.NewStore(stateDB, sm.StoreOptions{ DiscardABCIResponses: false, }) - blockStore := store.NewBlockStore(dbm.NewMemDB()) + blockStore := store.NewBlockStore(dbm.NewMemDB(), store.BlockStoreOptions{}) eventBus := types.NewEventBus() err = eventBus.Start() require.NoError(t, err) @@ -494,7 +494,7 @@ func TestEndBlockValidatorUpdates(t *testing.T) { mock.Anything).Return(nil) mp.On("ReapMaxBytesMaxGas", mock.Anything, mock.Anything).Return(types.Txs{}) - blockStore := store.NewBlockStore(dbm.NewMemDB()) + blockStore := store.NewBlockStore(dbm.NewMemDB(), store.BlockStoreOptions{}) blockExec := sm.NewBlockExecutor( stateStore, log.TestingLogger(), @@ -570,7 +570,7 @@ func TestEndBlockValidatorUpdatesResultingInEmptySet(t *testing.T) { stateStore := sm.NewStore(stateDB, sm.StoreOptions{ DiscardABCIResponses: false, }) - blockStore := store.NewBlockStore(dbm.NewMemDB()) + blockStore := store.NewBlockStore(dbm.NewMemDB(), store.BlockStoreOptions{}) blockExec := sm.NewBlockExecutor( stateStore, log.TestingLogger(), @@ -624,7 +624,7 @@ func TestEmptyPrepareProposal(t *testing.T) { mock.Anything).Return(nil) mp.On("ReapMaxBytesMaxGas", mock.Anything, mock.Anything).Return(types.Txs{}) - blockStore := store.NewBlockStore(dbm.NewMemDB()) + blockStore := store.NewBlockStore(dbm.NewMemDB(), store.BlockStoreOptions{}) blockExec := sm.NewBlockExecutor( stateStore, log.TestingLogger(), @@ -667,7 +667,7 @@ func TestPrepareProposalTxsAllIncluded(t *testing.T) { require.NoError(t, err) defer proxyApp.Stop() //nolint:errcheck // ignore for tests - blockStore := store.NewBlockStore(dbm.NewMemDB()) + blockStore := store.NewBlockStore(dbm.NewMemDB(), store.BlockStoreOptions{}) blockExec := sm.NewBlockExecutor( stateStore, log.TestingLogger(), @@ -720,7 +720,7 @@ func TestPrepareProposalReorderTxs(t *testing.T) { require.NoError(t, err) defer proxyApp.Stop() //nolint:errcheck // ignore for tests - blockStore := store.NewBlockStore(dbm.NewMemDB()) + blockStore := store.NewBlockStore(dbm.NewMemDB(), store.BlockStoreOptions{}) blockExec := sm.NewBlockExecutor( stateStore, log.TestingLogger(), @@ -775,7 +775,7 @@ func TestPrepareProposalErrorOnTooManyTxs(t *testing.T) { require.NoError(t, err) defer proxyApp.Stop() //nolint:errcheck // ignore for tests - blockStore := store.NewBlockStore(dbm.NewMemDB()) + blockStore := store.NewBlockStore(dbm.NewMemDB(), store.BlockStoreOptions{}) blockExec := sm.NewBlockExecutor( stateStore, log.NewNopLogger(), @@ -825,7 +825,7 @@ func TestPrepareProposalErrorOnPrepareProposalError(t *testing.T) { require.NoError(t, err) defer proxyApp.Stop() //nolint:errcheck // ignore for tests - blockStore := store.NewBlockStore(dbm.NewMemDB()) + blockStore := store.NewBlockStore(dbm.NewMemDB(), store.BlockStoreOptions{}) blockExec := sm.NewBlockExecutor( stateStore, log.NewNopLogger(), diff --git a/state/mocks/block_store.go b/state/mocks/block_store.go index d449f6711..0bd0aed3c 100644 --- a/state/mocks/block_store.go +++ b/state/mocks/block_store.go @@ -237,7 +237,7 @@ type mockConstructorTestingTNewBlockStore interface { } // NewBlockStore creates a new instance of BlockStore. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewBlockStore(t mockConstructorTestingTNewBlockStore) *BlockStore { +func NewBlockStore(t mockConstructorTestingTNewBlockStore, store.BlockStoreOptions{}) *BlockStore { mock := &BlockStore{} mock.Mock.Test(t) diff --git a/state/rollback_test.go b/state/rollback_test.go index 9e2d03efc..43a5185c1 100644 --- a/state/rollback_test.go +++ b/state/rollback_test.go @@ -87,7 +87,7 @@ func TestRollback(t *testing.T) { func TestRollbackHard(t *testing.T) { const height int64 = 100 - blockStore := store.NewBlockStore(dbm.NewMemDB()) + blockStore := store.NewBlockStore(dbm.NewMemDB(), store.BlockStoreOptions{}) stateStore := state.NewStore(dbm.NewMemDB(), state.StoreOptions{DiscardABCIResponses: false}) valSet, _ := types.RandValidatorSet(5, 10) diff --git a/state/validation_test.go b/state/validation_test.go index 152eb1d74..480a85e52 100644 --- a/state/validation_test.go +++ b/state/validation_test.go @@ -47,7 +47,7 @@ func TestValidateBlockHeader(t *testing.T) { mock.Anything, mock.Anything).Return(nil) - blockStore := store.NewBlockStore(dbm.NewMemDB()) + blockStore := store.NewBlockStore(dbm.NewMemDB(), store.BlockStoreOptions{}) blockExec := sm.NewBlockExecutor( stateStore, @@ -135,7 +135,7 @@ func TestValidateBlockCommit(t *testing.T) { mock.Anything, mock.Anything).Return(nil) - blockStore := store.NewBlockStore(dbm.NewMemDB()) + blockStore := store.NewBlockStore(dbm.NewMemDB(), store.BlockStoreOptions{}) blockExec := sm.NewBlockExecutor( stateStore, @@ -277,7 +277,7 @@ func TestValidateBlockEvidence(t *testing.T) { mock.Anything, mock.Anything).Return(nil) state.ConsensusParams.Evidence.MaxBytes = 1000 - blockStore := store.NewBlockStore(dbm.NewMemDB()) + blockStore := store.NewBlockStore(dbm.NewMemDB(), store.BlockStoreOptions{}) blockExec := sm.NewBlockExecutor( stateStore, diff --git a/store/store.go b/store/store.go index f0e2e37a2..d0bb70e2c 100644 --- a/store/store.go +++ b/store/store.go @@ -47,14 +47,23 @@ type BlockStore struct { height int64 } +type BlockStoreOptions struct { + Metrics *Metrics +} + // NewBlockStore returns a new BlockStore with the given DB, // initialized to the last height that was committed to the DB. -func NewBlockStore(db dbm.DB) *BlockStore { +func NewBlockStore(db dbm.DB, o BlockStoreOptions) *BlockStore { bs := LoadBlockStoreState(db) + m := NopMetrics() + if o.Metrics != nil { + m = o.Metrics + } return &BlockStore{ - base: bs.Base, - height: bs.Height, - db: db, + metrics: m, + base: bs.Base, + height: bs.Height, + db: db, } } diff --git a/store/store_test.go b/store/store_test.go index 93c9227d6..bb50a0067 100644 --- a/store/store_test.go +++ b/store/store_test.go @@ -56,7 +56,7 @@ func makeStateAndBlockStore(logger log.Logger) (sm.State, *BlockStore, cleanupFu if err != nil { panic(fmt.Errorf("error constructing state from genesis file: %w", err)) } - return state, NewBlockStore(blockDB), func() { os.RemoveAll(config.RootDir) } + return state, NewBlockStore(blockDB, store.BlockStoreOptions{}) , func() { os.RemoveAll(config.RootDir) } } func TestLoadBlockStoreState(t *testing.T) { @@ -82,13 +82,13 @@ func TestLoadBlockStoreState(t *testing.T) { } } -func TestNewBlockStore(t *testing.T) { +func TestNewBlockStore(t *testing.T, store.BlockStoreOptions{}) { db := dbm.NewMemDB() bss := tmstore.BlockStoreState{Base: 100, Height: 10000} bz, _ := proto.Marshal(&bss) err := db.Set(blockStoreKey, bz) require.NoError(t, err) - bs := NewBlockStore(db) + bs := NewBlockStore(db, store.BlockStoreOptions{}) require.Equal(t, int64(100), bs.Base(), "failed to properly parse blockstore") require.Equal(t, int64(10000), bs.Height(), "failed to properly parse blockstore") @@ -106,7 +106,7 @@ func TestNewBlockStore(t *testing.T) { _, _, panicErr := doFn(func() (interface{}, error) { err := db.Set(blockStoreKey, tt.data) require.NoError(t, err) - _ = NewBlockStore(db) + _ = NewBlockStore(db, store.BlockStoreOptions{}) return nil, nil }) require.NotNil(t, panicErr, "#%d panicCauser: %q expected a panic", i, tt.data) @@ -115,13 +115,13 @@ func TestNewBlockStore(t *testing.T) { err = db.Set(blockStoreKey, []byte{}) require.NoError(t, err) - bs = NewBlockStore(db) + bs = NewBlockStore(db, store.BlockStoreOptions{}) assert.Equal(t, bs.Height(), int64(0), "expecting empty bytes to be unmarshaled alright") } func freshBlockStore() (*BlockStore, dbm.DB) { db := dbm.NewMemDB() - return NewBlockStore(db), db + return NewBlockStore(db, store.BlockStoreOptions{}) , db } var ( @@ -371,7 +371,7 @@ func TestLoadBaseMeta(t *testing.T) { }) state, err := stateStore.LoadFromDBOrGenesisFile(config.GenesisFile()) require.NoError(t, err) - bs := NewBlockStore(dbm.NewMemDB()) + bs := NewBlockStore(dbm.NewMemDB(), store.BlockStoreOptions{}) for h := int64(1); h <= 10; h++ { block := state.MakeBlock(h, test.MakeNTxs(h, 10), new(types.Commit), nil, state.Validators.GetProposer().Address) @@ -434,7 +434,7 @@ func TestPruneBlocks(t *testing.T) { state, err := stateStore.LoadFromDBOrGenesisFile(config.GenesisFile()) require.NoError(t, err) db := dbm.NewMemDB() - bs := NewBlockStore(db) + bs := NewBlockStore(db, store.BlockStoreOptions{}) assert.EqualValues(t, 0, bs.Base()) assert.EqualValues(t, 0, bs.Height()) assert.EqualValues(t, 0, bs.Size()) @@ -573,7 +573,7 @@ func TestLoadBlockMetaByHash(t *testing.T) { }) state, err := stateStore.LoadFromDBOrGenesisFile(config.GenesisFile()) require.NoError(t, err) - bs := NewBlockStore(dbm.NewMemDB()) + bs := NewBlockStore(dbm.NewMemDB(), store.BlockStoreOptions{}) b1 := state.MakeBlock(state.LastBlockHeight+1, test.MakeNTxs(state.LastBlockHeight+1, 10), new(types.Commit), nil, state.Validators.GetProposer().Address) partSet, err := b1.MakePartSet(2) diff --git a/test/loadtime/cmd/report/main.go b/test/loadtime/cmd/report/main.go index cec5204da..342489a31 100644 --- a/test/loadtime/cmd/report/main.go +++ b/test/loadtime/cmd/report/main.go @@ -46,7 +46,7 @@ func main() { if err != nil { panic(err) } - s := store.NewBlockStore(db) + s := store.NewBlockStore(db, store.BlockStoreOptions{}) defer s.Close() rs, err := report.GenerateFromBlockStore(s) if err != nil {