From 16e5d1a47b6d517957d0d69b437a50c743c32b42 Mon Sep 17 00:00:00 2001 From: Daniel Wedul <72031080+dwedul-figure@users.noreply.github.com> Date: Fri, 18 Mar 2022 03:26:20 -0600 Subject: [PATCH] feat(types): Deprecate the DBBackend variable in favor of new app-db-backend config entry (#11188) * [10948]: Add changelog entry. * [10948]: Deprecate the types.DBBackend variable and the NewLevelDB function. Create a NewDB function to replace them. * [10948]: Add a DBBackend string to the simulation config and a flag for setting it. Update the simulation setup to use that instead of the compile-time DBBackend variable. * [10948]: Update the mock app creator to use the NewDB function. Not sure what to do about the db backend in that case though. * [10948]: Update changelog to reflect new db-backend field name. * [10948]: Use the tendermint db-backend type for the snapshot db. * [10948]: Update the last use of NewLevelDB by adding a parameter to openDB and uppdating calls to that to provide the db type to use. * [10948]: Upddate the NewDB function to also have a default db backend type if an empty string is provided there. * [10948]: Remove the new TODO in mock.NewApp. After looking through it's uses, there doesn't seem to be any desire to change it, and there's no easy way to communicate it. * [10948]: Enhance the NewDB defer function to also add info to any err that is being returned. * [10948]: Add some unit tests for NewDB. * [10948]: Lint fixes. * [10948]: Add a changelog entry to the deprecated section. * [10948]: Update the makefile to no longer set the types.DBBackend value. * [10948]: Use memdb for the mock app instead of goleveldb. I know it was a goleveldb before, but for a mock app, a memdb feels like a better choice (assuming 'mock' and 'mem' mean what I assume they mean). * [10948]: Fix the store benchmark tests (had some index-out-of-range issues). * [10948]: Fix cachekv store bench test calling iter.Key() before checking iter.Valid(). * [10948]: Remove the panic recovery from types.NewDB since dbm.NewDB returns an error now (it didn't originally, when NewLevelDB was first written). * [10948]: Add changlog entry indicationg an API breaking change due to the DBBackend change. * [10948]: Get rid of the types.NewDB function in favor of just using the tm-db version of it. * [10948]: Fix Update the codeql-analysis github action to use go v1.17. * [10948]: Add config file option for the app db backend type. * [10948]: Adjust the comment on the app-db-backend config entry to clarify fallback behavior. * [10948]: Add a default of GoLevelDBBackend to GetAppDBBackend. The old DBBackend variable defaulted to that, and some unit tests assume that behavior still exists. * [10948]: Add the missing quotes around the app-db-backend value. * [10948]: Small tweak to the changelog's deprecated entry. * Add the go version declaration back into the codeql-analysis github action. * [10948]: Update new use of openDB. * [10948]: Put a brief delay after closing the test network. Hopefully that helps with address-in-use and non-empty directory errors. Co-authored-by: Marko --- .github/workflows/codeql-analysis.yml | 3 + CHANGELOG.md | 5 +- Makefile | 9 +-- server/config/config.go | 6 ++ server/config/toml.go | 6 ++ server/constructors_test.go | 4 +- server/export.go | 2 +- server/mock/app.go | 3 +- server/rollback.go | 2 +- server/start.go | 6 +- server/util.go | 20 ++++++- server/util_test.go | 85 +++++++++++++++++++++++++++ simapp/config.go | 3 + simapp/simd/cmd/root.go | 2 +- simapp/utils.go | 2 +- store/cachekv/store_bench_test.go | 17 ++++-- testutil/network/network.go | 4 ++ types/simulation/config.go | 2 + types/utils.go | 4 +- 19 files changed, 158 insertions(+), 27 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index b43b7a7be..d60b76ba6 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -17,6 +17,9 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v3 + - uses: actions/setup-go@v3 + with: + go-version: 1.17 - uses: actions/setup-go@v3 with: diff --git a/CHANGELOG.md b/CHANGELOG.md index 40bcadd76..136af4345 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -71,6 +71,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ * [#11179](https://github.com/cosmos/cosmos-sdk/pull/11179) Add state rollback command. * [\#10794](https://github.com/cosmos/cosmos-sdk/pull/10794) ADR-040: Add State Sync to V2 Store * [\#11234](https://github.com/cosmos/cosmos-sdk/pull/11234) Add `GRPCClient` field to Client Context. If `GRPCClient` field is set to nil, the `Invoke` method would use ABCI query, otherwise use gprc. +* (types) [\#10948](https://github.com/cosmos/cosmos-sdk/issues/10948) Add `app-db-backend` to the `app.toml` config to replace the compile-time `types.DBbackend` variable. ### API Breaking Changes @@ -131,7 +132,8 @@ Ref: https://keepachangelog.com/en/1.0.0/ * [\#10816](https://github.com/cosmos/cosmos-sdk/pull/10816) Reuse blocked addresses from the bank module. No need to pass them to distribution. * [\#10852](https://github.com/cosmos/cosmos-sdk/pull/10852) Move `x/gov/types` to `x/gov/types/v1beta2`. * [\#10922](https://github.com/cosmos/cosmos-sdk/pull/10922), [/#10957](https://github.com/cosmos/cosmos-sdk/pull/10957) Move key `server.Generate*` functions to testutil and support custom mnemonics in in-process testing network. Moved `TestMnemonic` from `testutil` package to `testdata`. -* (x/bank) [\#10771](https://github.com/cosmos/cosmos-sdk/pull/10771) Add safety check on bank module perms to allow module-specific mint restrictions (e.g. only minting a certain denom).* (x/bank) [\#10771](https://github.com/cosmos/cosmos-sdk/pull/10771) Add `bank.BaseKeeper.WithMintCoinsRestriction` function to restrict use of bank `MintCoins` usage. +* (x/bank) [\#10771](https://github.com/cosmos/cosmos-sdk/pull/10771) Add safety check on bank module perms to allow module-specific mint restrictions (e.g. only minting a certain denom). +* (x/bank) [\#10771](https://github.com/cosmos/cosmos-sdk/pull/10771) Add `bank.BaseKeeper.WithMintCoinsRestriction` function to restrict use of bank `MintCoins` usage. * [\#10868](https://github.com/cosmos/cosmos-sdk/pull/10868), [\#10989](https://github.com/cosmos/cosmos-sdk/pull/10989) The Gov keeper accepts now 2 more mandatory arguments, the ServiceMsgRouter and a maximum proposal metadata length. * [\#10868](https://github.com/cosmos/cosmos-sdk/pull/10868), [\#10989](https://github.com/cosmos/cosmos-sdk/pull/10989), [\#11093](https://github.com/cosmos/cosmos-sdk/pull/11093) The Gov keeper accepts now 2 more mandatory arguments, the ServiceMsgRouter and a gov Config including the max metadata length. * [\#11124](https://github.com/cosmos/cosmos-sdk/pull/11124) Add `GetAllVersions` to application store @@ -250,6 +252,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### Deprecated * (x/upgrade) [\#9906](https://github.com/cosmos/cosmos-sdk/pull/9906) Deprecate `UpgradeConsensusState` gRPC query since this functionality is only used for IBC, which now has its own [IBC replacement](https://github.com/cosmos/ibc-go/blob/2c880a22e9f9cc75f62b527ca94aa75ce1106001/proto/ibc/core/client/v1/query.proto#L54) +* (types) [\#10948](https://github.com/cosmos/cosmos-sdk/issues/10948) Deprecate the types.DBBackend variable and types.NewLevelDB function. They are replaced by a new entry in `app.toml`: `app-db-backend` and `tendermint/tm-db`s `NewDB` function. If `app-db-backend` is defined, then it is used. Otherwise, if `types.DBBackend` is defined, it is used (until removed: [\#11241](https://github.com/cosmos/cosmos-sdk/issues/11241)). Otherwise, Tendermint config's `db-backend` is used. ## [v0.45.0](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.45.0) - 2022-01-18 diff --git a/Makefile b/Makefile index 1de9ea569..315add753 100644 --- a/Makefile +++ b/Makefile @@ -46,10 +46,6 @@ ifeq ($(LEDGER_ENABLED),true) endif endif -ifeq (cleveldb,$(findstring cleveldb,$(COSMOS_BUILD_OPTIONS))) - build_tags += gcc -endif - ifeq (secp,$(findstring secp,$(COSMOS_BUILD_OPTIONS))) build_tags += libsecp256k1_sdk endif @@ -77,10 +73,9 @@ endif # DB backend selection ifeq (cleveldb,$(findstring cleveldb,$(COSMOS_BUILD_OPTIONS))) - ldflags += -X github.com/cosmos/cosmos-sdk/types.DBBackend=cleveldb + build_tags += gcc endif ifeq (badgerdb,$(findstring badgerdb,$(COSMOS_BUILD_OPTIONS))) - ldflags += -X github.com/cosmos/cosmos-sdk/types.DBBackend=badgerdb BUILD_TAGS += badgerdb endif # handle rocksdb @@ -90,12 +85,10 @@ ifeq (rocksdb,$(findstring rocksdb,$(COSMOS_BUILD_OPTIONS))) endif CGO_ENABLED=1 BUILD_TAGS += rocksdb - ldflags += -X github.com/cosmos/cosmos-sdk/types.DBBackend=rocksdb endif # handle boltdb ifeq (boltdb,$(findstring boltdb,$(COSMOS_BUILD_OPTIONS))) BUILD_TAGS += boltdb - ldflags += -X github.com/cosmos/cosmos-sdk/types.DBBackend=boltdb endif ifeq (,$(findstring nostrip,$(COSMOS_BUILD_OPTIONS))) diff --git a/server/config/config.go b/server/config/config.go index 64262c37a..c85b89fe4 100644 --- a/server/config/config.go +++ b/server/config/config.go @@ -70,6 +70,10 @@ type BaseConfig struct { IndexEvents []string `mapstructure:"index-events"` // IavlCacheSize set the size of the iavl tree cache. IAVLCacheSize uint64 `mapstructure:"iavl-cache-size"` + + // AppDBBackend defines the type of Database to use for the application and snapshots databases. + // An empty string indicates that the Tendermint config's DBBackend value should be used. + AppDBBackend string `mapstructure:"app-db-backend"` } // APIConfig defines the API listener configuration. @@ -210,6 +214,7 @@ func DefaultConfig() *Config { MinRetainBlocks: 0, IndexEvents: make([]string, 0), IAVLCacheSize: 781250, // 50 MB + AppDBBackend: "", }, Telemetry: telemetry.Config{ Enabled: false, @@ -269,6 +274,7 @@ func GetConfig(v *viper.Viper) Config { IndexEvents: v.GetStringSlice("index-events"), MinRetainBlocks: v.GetUint64("min-retain-blocks"), IAVLCacheSize: v.GetUint64("iavl-cache-size"), + AppDBBackend: v.GetString("app-db-backend"), }, Telemetry: telemetry.Config{ ServiceName: v.GetString("telemetry.service-name"), diff --git a/server/config/toml.go b/server/config/toml.go index f0f4ce5c8..4b574b5e7 100644 --- a/server/config/toml.go +++ b/server/config/toml.go @@ -75,6 +75,12 @@ index-events = [{{ range .BaseConfig.IndexEvents }}{{ printf "%q, " . }}{{end}}] # Default cache size is 50mb. iavl-cache-size = {{ .BaseConfig.IAVLCacheSize }} +# AppDBBackend defines the database backend type to use for the application and snapshots DBs. +# An empty string indicates that a fallback will be used. +# First fallback is the deprecated compile-time types.DBBackend value. +# Second fallback (if the types.DBBackend also isn't set), is the db-backend value set in Tendermint's config.toml. +app-db-backend = "{{ .BaseConfig.AppDBBackend }}" + ############################################################################### ### Telemetry Configuration ### ############################################################################### diff --git a/server/constructors_test.go b/server/constructors_test.go index c131c2c98..646311b45 100644 --- a/server/constructors_test.go +++ b/server/constructors_test.go @@ -5,11 +5,13 @@ import ( "testing" "github.com/stretchr/testify/require" + + dbm "github.com/tendermint/tm-db" ) func Test_openDB(t *testing.T) { t.Parallel() - _, err := openDB(t.TempDir()) + _, err := openDB(t.TempDir(), dbm.GoLevelDBBackend) require.NoError(t, err) } diff --git a/server/export.go b/server/export.go index 38938bcae..512c3d86d 100644 --- a/server/export.go +++ b/server/export.go @@ -37,7 +37,7 @@ func ExportCmd(appExporter types.AppExporter, defaultNodeHome string) *cobra.Com return err } - db, err := openDB(config.RootDir) + db, err := openDB(config.RootDir, GetAppDBBackend(serverCtx.Viper)) if err != nil { return err } diff --git a/server/mock/app.go b/server/mock/app.go index 8ef0ae405..9fd4d72f4 100644 --- a/server/mock/app.go +++ b/server/mock/app.go @@ -9,6 +9,7 @@ import ( abci "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/libs/log" "github.com/tendermint/tendermint/types" + dbm "github.com/tendermint/tm-db" bam "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/codec" @@ -34,7 +35,7 @@ func testTxHandler(options middleware.TxHandlerOptions) tx.Handler { // similar to a real app. Make sure rootDir is empty before running the test, // in order to guarantee consistent results func NewApp(rootDir string, logger log.Logger) (abci.Application, error) { - db, err := sdk.NewLevelDB("mock", filepath.Join(rootDir, "data")) + db, err := dbm.NewDB("mock", dbm.MemDBBackend, filepath.Join(rootDir, "data")) if err != nil { return nil, err } diff --git a/server/rollback.go b/server/rollback.go index f10bcaead..1413967d5 100644 --- a/server/rollback.go +++ b/server/rollback.go @@ -26,7 +26,7 @@ application. ctx := GetServerContextFromCmd(cmd) cfg := ctx.Config home := cfg.RootDir - db, err := openDB(home) + db, err := openDB(home, GetAppDBBackend(ctx.Viper)) if err != nil { return err } diff --git a/server/start.go b/server/start.go index 52e9e63a3..4b8e9c2b1 100644 --- a/server/start.go +++ b/server/start.go @@ -171,7 +171,7 @@ func startStandAlone(ctx *Context, appCreator types.AppCreator) error { transport := ctx.Viper.GetString(flagTransport) home := ctx.Viper.GetString(flags.FlagHome) - db, err := openDB(home) + db, err := openDB(home, GetAppDBBackend(ctx.Viper)) if err != nil { return err } @@ -230,12 +230,12 @@ func startInProcess(ctx *Context, clientCtx client.Context, appCreator types.App } } - traceWriterFile := ctx.Viper.GetString(flagTraceStore) - db, err := openDB(home) + db, err := openDB(home, GetAppDBBackend(ctx.Viper)) if err != nil { return err } + traceWriterFile := ctx.Viper.GetString(flagTraceStore) traceWriter, err := openTraceWriter(traceWriterFile) if err != nil { return err diff --git a/server/util.go b/server/util.go index f8087086e..ffd0e9b51 100644 --- a/server/util.go +++ b/server/util.go @@ -16,6 +16,7 @@ import ( "github.com/rs/zerolog" "github.com/rs/zerolog/log" + "github.com/spf13/cast" "github.com/spf13/cobra" "github.com/spf13/pflag" "github.com/spf13/viper" @@ -348,6 +349,21 @@ func WaitForQuitSignals() ErrorCode { return ErrorCode{Code: int(sig.(syscall.Signal)) + 128} } +// GetAppDBBackend gets the backend type to use for the application DBs. +func GetAppDBBackend(opts types.AppOptions) dbm.BackendType { + rv := cast.ToString(opts.Get("app-db-backend")) + if len(rv) == 0 { + rv = sdk.DBBackend + } + if len(rv) == 0 { + rv = cast.ToString(opts.Get("db-backend")) + } + if len(rv) != 0 { + return dbm.BackendType(rv) + } + return dbm.GoLevelDBBackend +} + func skipInterface(iface net.Interface) bool { if iface.Flags&net.FlagUp == 0 { return true // interface down @@ -372,9 +388,9 @@ func addrToIP(addr net.Addr) net.IP { return ip } -func openDB(rootDir string) (dbm.DB, error) { +func openDB(rootDir string, backendType dbm.BackendType) (dbm.DB, error) { dataDir := filepath.Join(rootDir, "data") - return sdk.NewLevelDB("application", dataDir) + return dbm.NewDB("application", backendType, dataDir) } func openTraceWriter(traceWriterFile string) (w io.Writer, err error) { diff --git a/server/util_test.go b/server/util_test.go index 4a297af46..3a4cb8138 100644 --- a/server/util_test.go +++ b/server/util_test.go @@ -11,14 +11,18 @@ import ( "testing" "github.com/spf13/cobra" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" tmcfg "github.com/tendermint/tendermint/config" + dbm "github.com/tendermint/tm-db" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/server" "github.com/cosmos/cosmos-sdk/server/config" + servertypes "github.com/cosmos/cosmos-sdk/server/types" "github.com/cosmos/cosmos-sdk/simapp" + "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" ) @@ -438,3 +442,84 @@ func TestEmptyMinGasPrices(t *testing.T) { err = cmd.ExecuteContext(ctx) require.Errorf(t, err, sdkerrors.ErrAppConfig.Error()) } + +type mapGetter map[string]interface{} + +func (m mapGetter) Get(key string) interface{} { + return m[key] +} + +var _ servertypes.AppOptions = mapGetter{} + +func TestGetAppDBBackend(t *testing.T) { + origDBBackend := types.DBBackend + defer func() { + types.DBBackend = origDBBackend + }() + tests := []struct { + name string + dbBack string + opts mapGetter + exp dbm.BackendType + }{ + { + name: "nothing set", + dbBack: "", + opts: mapGetter{}, + exp: dbm.GoLevelDBBackend, + }, + + { + name: "only db-backend set", + dbBack: "", + opts: mapGetter{"db-backend": "db-backend value 1"}, + exp: dbm.BackendType("db-backend value 1"), + }, + { + name: "only DBBackend set", + dbBack: "DBBackend value 2", + opts: mapGetter{}, + exp: dbm.BackendType("DBBackend value 2"), + }, + { + name: "only app-db-backend set", + dbBack: "", + opts: mapGetter{"app-db-backend": "app-db-backend value 3"}, + exp: dbm.BackendType("app-db-backend value 3"), + }, + + { + name: "app-db-backend and db-backend set", + dbBack: "", + opts: mapGetter{"db-backend": "db-backend value 4", "app-db-backend": "app-db-backend value 5"}, + exp: dbm.BackendType("app-db-backend value 5"), + }, + { + name: "app-db-backend and DBBackend set", + dbBack: "DBBackend value 6", + opts: mapGetter{"app-db-backend": "app-db-backend value 7"}, + exp: dbm.BackendType("app-db-backend value 7"), + }, + { + name: "db-backend and DBBackend set", + dbBack: "DBBackend value 8", + opts: mapGetter{"db-backend": "db-backend value 9"}, + exp: dbm.BackendType("DBBackend value 8"), + }, + + { + name: "all of app-db-backend db-backend DBBackend set", + dbBack: "DBBackend value 10", + opts: mapGetter{"db-backend": "db-backend value 11", "app-db-backend": "app-db-backend value 12"}, + exp: dbm.BackendType("app-db-backend value 12"), + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(st *testing.T) { + types.DBBackend = tc.dbBack + act := server.GetAppDBBackend(tc.opts) + assert.Equal(st, tc.exp, act) + }) + } +} diff --git a/simapp/config.go b/simapp/config.go index 98df982bd..48cc053f2 100644 --- a/simapp/config.go +++ b/simapp/config.go @@ -22,6 +22,7 @@ var ( FlagCommitValue bool FlagOnOperationValue bool // TODO: Remove in favor of binary search for invariant violation FlagAllInvariantsValue bool + FlagDBBackendValue string FlagEnabledValue bool FlagVerboseValue bool @@ -46,6 +47,7 @@ func GetSimulatorFlags() { flag.BoolVar(&FlagCommitValue, "Commit", false, "have the simulation commit") flag.BoolVar(&FlagOnOperationValue, "SimulateEveryOperation", false, "run slow invariants every operation") flag.BoolVar(&FlagAllInvariantsValue, "PrintAllInvariants", false, "print all invariants if a broken invariant is found") + flag.StringVar(&FlagDBBackendValue, "DBBackend", "goleveldb", "custom db backend type") // simulation flags flag.BoolVar(&FlagEnabledValue, "Enabled", false, "enable the simulation") @@ -71,5 +73,6 @@ func NewConfigFromFlags() simulation.Config { Commit: FlagCommitValue, OnOperation: FlagOnOperationValue, AllInvariants: FlagAllInvariantsValue, + DBBackend: FlagDBBackendValue, } } diff --git a/simapp/simd/cmd/root.go b/simapp/simd/cmd/root.go index d1425eb89..9ae7f10a7 100644 --- a/simapp/simd/cmd/root.go +++ b/simapp/simd/cmd/root.go @@ -261,7 +261,7 @@ func (a appCreator) newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, a } snapshotDir := filepath.Join(cast.ToString(appOpts.Get(flags.FlagHome)), "data", "snapshots") - snapshotDB, err := sdk.NewLevelDB("metadata", snapshotDir) + snapshotDB, err := dbm.NewDB("metadata", server.GetAppDBBackend(appOpts), snapshotDir) if err != nil { panic(err) } diff --git a/simapp/utils.go b/simapp/utils.go index 51d8ef540..1478104a5 100644 --- a/simapp/utils.go +++ b/simapp/utils.go @@ -39,7 +39,7 @@ func SetupSimulation(dirPrefix, dbName string) (simtypes.Config, dbm.DB, string, return simtypes.Config{}, nil, "", nil, false, err } - db, err := sdk.NewLevelDB(dbName, dir) + db, err := dbm.NewDB(dbName, dbm.BackendType(config.DBBackend), dir) if err != nil { return simtypes.Config{}, nil, "", nil, false, err } diff --git a/store/cachekv/store_bench_test.go b/store/cachekv/store_bench_test.go index 88c86eff5..c5cb92f0e 100644 --- a/store/cachekv/store_bench_test.go +++ b/store/cachekv/store_bench_test.go @@ -35,7 +35,8 @@ func benchmarkBlankParentIteratorNext(b *testing.B, keysize int) { iter := kvstore.Iterator(keys[0], keys[b.N]) defer iter.Close() - for _ = iter.Key(); iter.Valid(); iter.Next() { + for ; iter.Valid(); iter.Next() { + _ = iter.Key() // deadcode elimination stub sink = iter } @@ -70,7 +71,8 @@ func benchmarkRandomSet(b *testing.B, keysize int) { // Use a singleton for value, to not waste time computing it value := randSlice(defaultValueSizeBz) - keys := generateRandomKeys(keysize, b.N) + // Add 1 to avoid issues when b.N = 1 + keys := generateRandomKeys(keysize, b.N+1) b.ReportAllocs() b.ResetTimer() @@ -82,7 +84,8 @@ func benchmarkRandomSet(b *testing.B, keysize int) { iter := kvstore.Iterator(keys[0], keys[b.N]) defer iter.Close() - for _ = iter.Key(); iter.Valid(); iter.Next() { + for ; iter.Valid(); iter.Next() { + _ = iter.Key() // deadcode elimination stub sink = iter } @@ -100,7 +103,8 @@ func benchmarkIteratorOnParentWithManyDeletes(b *testing.B, numDeletes int) { // Use simple values for keys, pick a random start, // and take next D keys sequentially after. startKey := randSlice(32) - keys := generateSequentialKeys(startKey, numDeletes) + // Add 1 to avoid issues when numDeletes = 1 + keys := generateSequentialKeys(startKey, numDeletes+1) // setup parent db with D keys. for _, k := range keys { mem.Set(k, value) @@ -118,10 +122,11 @@ func benchmarkIteratorOnParentWithManyDeletes(b *testing.B, numDeletes int) { b.ReportAllocs() b.ResetTimer() - iter := kvstore.Iterator(keys[0], keys[b.N]) + iter := kvstore.Iterator(keys[0], keys[numDeletes]) defer iter.Close() - for _ = iter.Key(); iter.Valid(); iter.Next() { + for ; iter.Valid(); iter.Next() { + _ = iter.Key() // deadcode elimination stub sink = iter } diff --git a/testutil/network/network.go b/testutil/network/network.go index 4de1c7288..c21c78d54 100644 --- a/testutil/network/network.go +++ b/testutil/network/network.go @@ -603,6 +603,10 @@ func (n *Network) Cleanup() { } } + // Give a brief pause for things to finish closing in other processes. Hopefully this helps with the address-in-use errors. + // 100ms chosen randomly. + time.Sleep(100 * time.Millisecond) + if n.Config.CleanupDir { _ = os.RemoveAll(n.BaseDir) } diff --git a/types/simulation/config.go b/types/simulation/config.go index 8bad70954..7f520004d 100644 --- a/types/simulation/config.go +++ b/types/simulation/config.go @@ -21,4 +21,6 @@ type Config struct { OnOperation bool // run slow invariants every operation AllInvariants bool // print all failed invariants if a broken invariant is found + + DBBackend string // custom db backend type } diff --git a/types/utils.go b/types/utils.go index cca98edf0..dc13af6f9 100644 --- a/types/utils.go +++ b/types/utils.go @@ -11,7 +11,7 @@ import ( var ( // This is set at compile time. Could be cleveldb, defaults is goleveldb. - DBBackend = "" + DBBackend = "" // Deprecated: Use tendermint config's DBBackend value instead. backend = dbm.GoLevelDBBackend ) @@ -85,6 +85,8 @@ func ParseTimeBytes(bz []byte) (time.Time, error) { } // NewLevelDB instantiate a new LevelDB instance according to DBBackend. +// +// Deprecated: Use NewDB (from "github.com/tendermint/tm-db") instead. Suggested backendType is tendermint config's DBBackend value. func NewLevelDB(name, dir string) (db dbm.DB, err error) { defer func() { if r := recover(); r != nil {