feat: configurable fastnode (#13321)
This commit is contained in:
parent
822900b69f
commit
412e2fc86e
|
@ -88,6 +88,7 @@ Ref: https://keepachangelog.com/en/1.0.0/
|
||||||
* [#13233](https://github.com/cosmos/cosmos-sdk/pull/13233) Add `--append` to `add-genesis-account` sub-command to append new tokens after an account is already created.
|
* [#13233](https://github.com/cosmos/cosmos-sdk/pull/13233) Add `--append` to `add-genesis-account` sub-command to append new tokens after an account is already created.
|
||||||
* [#13236](https://github.com/cosmos/cosmos-sdk/pull/13236) Integrate Filter Logging
|
* [#13236](https://github.com/cosmos/cosmos-sdk/pull/13236) Integrate Filter Logging
|
||||||
* [#13301](https://github.com/cosmos/cosmos-sdk/pull/13301) Keep the balance query endpoint compatible with legacy blocks
|
* [#13301](https://github.com/cosmos/cosmos-sdk/pull/13301) Keep the balance query endpoint compatible with legacy blocks
|
||||||
|
* [#13321](https://github.com/cosmos/cosmos-sdk/pull/13321) Add flag to disable fast node migration and usage.
|
||||||
|
|
||||||
### State Machine Breaking
|
### State Machine Breaking
|
||||||
|
|
||||||
|
|
|
@ -64,6 +64,11 @@ func SetIAVLCacheSize(size int) func(*BaseApp) {
|
||||||
return func(bapp *BaseApp) { bapp.cms.SetIAVLCacheSize(size) }
|
return func(bapp *BaseApp) { bapp.cms.SetIAVLCacheSize(size) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetIAVLDisableFastNode enables(false)/disables(true) fast node usage from the IAVL store.
|
||||||
|
func SetIAVLDisableFastNode(disable bool) func(*BaseApp) {
|
||||||
|
return func(bapp *BaseApp) { bapp.cms.SetIAVLDisableFastNode(disable) }
|
||||||
|
}
|
||||||
|
|
||||||
// SetInterBlockCache provides a BaseApp option function that sets the
|
// SetInterBlockCache provides a BaseApp option function that sets the
|
||||||
// inter-block cache.
|
// inter-block cache.
|
||||||
func SetInterBlockCache(cache sdk.MultiStorePersistentCache) func(*BaseApp) {
|
func SetInterBlockCache(cache sdk.MultiStorePersistentCache) func(*BaseApp) {
|
||||||
|
|
|
@ -25,7 +25,7 @@ func FuzzStoreInternalProofsCreateNonmembershipProof(f *testing.F) {
|
||||||
if len(sz.Data) == 0 || len(sz.Key) == 0 {
|
if len(sz.Data) == 0 || len(sz.Key) == 0 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
tree, err := iavl.NewMutableTree(db.NewMemDB(), 0)
|
tree, err := iavl.NewMutableTree(db.NewMemDB(), 0, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
2
go.mod
2
go.mod
|
@ -21,7 +21,7 @@ require (
|
||||||
github.com/cosmos/cosmos-sdk/store/tools/ics23 v0.0.0-20220820010601-dc361be9e3ff
|
github.com/cosmos/cosmos-sdk/store/tools/ics23 v0.0.0-20220820010601-dc361be9e3ff
|
||||||
github.com/cosmos/go-bip39 v1.0.0
|
github.com/cosmos/go-bip39 v1.0.0
|
||||||
github.com/cosmos/gogoproto v1.4.2
|
github.com/cosmos/gogoproto v1.4.2
|
||||||
github.com/cosmos/iavl v0.19.1
|
github.com/cosmos/iavl v0.19.2-0.20220916140702-9b6be3095313
|
||||||
github.com/cosmos/ledger-cosmos-go v0.11.1
|
github.com/cosmos/ledger-cosmos-go v0.11.1
|
||||||
github.com/gogo/gateway v1.1.0
|
github.com/gogo/gateway v1.1.0
|
||||||
github.com/golang/mock v1.6.0
|
github.com/golang/mock v1.6.0
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -197,8 +197,8 @@ github.com/cosmos/gogoproto v1.4.2 h1:UeGRcmFW41l0G0MiefWhkPEVEwvu78SZsHBvI78dAY
|
||||||
github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU=
|
github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU=
|
||||||
github.com/cosmos/gorocksdb v1.2.0 h1:d0l3jJG8M4hBouIZq0mDUHZ+zjOx044J3nGRskwTb4Y=
|
github.com/cosmos/gorocksdb v1.2.0 h1:d0l3jJG8M4hBouIZq0mDUHZ+zjOx044J3nGRskwTb4Y=
|
||||||
github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw=
|
github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw=
|
||||||
github.com/cosmos/iavl v0.19.1 h1:3gaq9b6SjiB0KBTygRnAvEGml2pQlu1TH8uma5g63Ys=
|
github.com/cosmos/iavl v0.19.2-0.20220916140702-9b6be3095313 h1:R7CnaI/0OLwOusy7n9750n8fqQ3yCQ8OJQI2L3ws9RA=
|
||||||
github.com/cosmos/iavl v0.19.1/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw=
|
github.com/cosmos/iavl v0.19.2-0.20220916140702-9b6be3095313/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw=
|
||||||
github.com/cosmos/keyring v1.2.0 h1:8C1lBP9xhImmIabyXW4c3vFjjLiBdGCmfLUfeZlV1Yo=
|
github.com/cosmos/keyring v1.2.0 h1:8C1lBP9xhImmIabyXW4c3vFjjLiBdGCmfLUfeZlV1Yo=
|
||||||
github.com/cosmos/keyring v1.2.0/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA=
|
github.com/cosmos/keyring v1.2.0/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA=
|
||||||
github.com/cosmos/ledger-cosmos-go v0.11.1 h1:9JIYsGnXP613pb2vPjFeMMjBI5lEDsEaF6oYorTy6J4=
|
github.com/cosmos/ledger-cosmos-go v0.11.1 h1:9JIYsGnXP613pb2vPjFeMMjBI5lEDsEaF6oYorTy6J4=
|
||||||
|
|
|
@ -81,9 +81,13 @@ type BaseConfig struct {
|
||||||
// IndexEvents defines the set of events in the form {eventType}.{attributeKey},
|
// IndexEvents defines the set of events in the form {eventType}.{attributeKey},
|
||||||
// which informs Tendermint what to index. If empty, all events will be indexed.
|
// which informs Tendermint what to index. If empty, all events will be indexed.
|
||||||
IndexEvents []string `mapstructure:"index-events"`
|
IndexEvents []string `mapstructure:"index-events"`
|
||||||
|
|
||||||
// IavlCacheSize set the size of the iavl tree cache.
|
// IavlCacheSize set the size of the iavl tree cache.
|
||||||
IAVLCacheSize uint64 `mapstructure:"iavl-cache-size"`
|
IAVLCacheSize uint64 `mapstructure:"iavl-cache-size"`
|
||||||
|
|
||||||
|
// IAVLDisableFastnNode enables or disables the fast sync node.
|
||||||
|
IAVLDisableFastnNode bool `mapstructure:"iavl-disable-fastnode"`
|
||||||
|
|
||||||
// AppDBBackend defines the type of Database to use for the application and snapshots databases.
|
// 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.
|
// An empty string indicates that the Tendermint config's DBBackend value should be used.
|
||||||
AppDBBackend string `mapstructure:"app-db-backend"`
|
AppDBBackend string `mapstructure:"app-db-backend"`
|
||||||
|
@ -236,15 +240,16 @@ func (c *Config) GetMinGasPrices() sdk.DecCoins {
|
||||||
func DefaultConfig() *Config {
|
func DefaultConfig() *Config {
|
||||||
return &Config{
|
return &Config{
|
||||||
BaseConfig: BaseConfig{
|
BaseConfig: BaseConfig{
|
||||||
MinGasPrices: defaultMinGasPrices,
|
MinGasPrices: defaultMinGasPrices,
|
||||||
InterBlockCache: true,
|
InterBlockCache: true,
|
||||||
Pruning: pruningtypes.PruningOptionDefault,
|
Pruning: pruningtypes.PruningOptionDefault,
|
||||||
PruningKeepRecent: "0",
|
PruningKeepRecent: "0",
|
||||||
PruningInterval: "0",
|
PruningInterval: "0",
|
||||||
MinRetainBlocks: 0,
|
MinRetainBlocks: 0,
|
||||||
IndexEvents: make([]string, 0),
|
IndexEvents: make([]string, 0),
|
||||||
IAVLCacheSize: 781250, // 50 MB
|
IAVLCacheSize: 781250, // 50 MB
|
||||||
AppDBBackend: "",
|
IAVLDisableFastnNode: false,
|
||||||
|
AppDBBackend: "",
|
||||||
},
|
},
|
||||||
Telemetry: telemetry.Config{
|
Telemetry: telemetry.Config{
|
||||||
Enabled: false,
|
Enabled: false,
|
||||||
|
@ -306,17 +311,18 @@ func GetConfig(v *viper.Viper) (Config, error) {
|
||||||
|
|
||||||
return Config{
|
return Config{
|
||||||
BaseConfig: BaseConfig{
|
BaseConfig: BaseConfig{
|
||||||
MinGasPrices: v.GetString("minimum-gas-prices"),
|
MinGasPrices: v.GetString("minimum-gas-prices"),
|
||||||
InterBlockCache: v.GetBool("inter-block-cache"),
|
InterBlockCache: v.GetBool("inter-block-cache"),
|
||||||
Pruning: v.GetString("pruning"),
|
Pruning: v.GetString("pruning"),
|
||||||
PruningKeepRecent: v.GetString("pruning-keep-recent"),
|
PruningKeepRecent: v.GetString("pruning-keep-recent"),
|
||||||
PruningInterval: v.GetString("pruning-interval"),
|
PruningInterval: v.GetString("pruning-interval"),
|
||||||
HaltHeight: v.GetUint64("halt-height"),
|
HaltHeight: v.GetUint64("halt-height"),
|
||||||
HaltTime: v.GetUint64("halt-time"),
|
HaltTime: v.GetUint64("halt-time"),
|
||||||
IndexEvents: v.GetStringSlice("index-events"),
|
IndexEvents: v.GetStringSlice("index-events"),
|
||||||
MinRetainBlocks: v.GetUint64("min-retain-blocks"),
|
MinRetainBlocks: v.GetUint64("min-retain-blocks"),
|
||||||
IAVLCacheSize: v.GetUint64("iavl-cache-size"),
|
IAVLCacheSize: v.GetUint64("iavl-cache-size"),
|
||||||
AppDBBackend: v.GetString("app-db-backend"),
|
IAVLDisableFastnNode: v.GetBool("iavl-disable-fastnode"),
|
||||||
|
AppDBBackend: v.GetString("app-db-backend"),
|
||||||
},
|
},
|
||||||
Telemetry: telemetry.Config{
|
Telemetry: telemetry.Config{
|
||||||
ServiceName: v.GetString("telemetry.service-name"),
|
ServiceName: v.GetString("telemetry.service-name"),
|
||||||
|
|
|
@ -74,6 +74,10 @@ index-events = [{{ range .BaseConfig.IndexEvents }}{{ printf "%q, " . }}{{end}}]
|
||||||
# Default cache size is 50mb.
|
# Default cache size is 50mb.
|
||||||
iavl-cache-size = {{ .BaseConfig.IAVLCacheSize }}
|
iavl-cache-size = {{ .BaseConfig.IAVLCacheSize }}
|
||||||
|
|
||||||
|
# IavlDisableFastnNode enables or disables the fast node feature of IAVL.
|
||||||
|
# Default is false.
|
||||||
|
iavl-disable-fastnode = {{ .BaseConfig.IAVLDisableFastnNode }}
|
||||||
|
|
||||||
# AppDBBackend defines the database backend type to use for the application and snapshots DBs.
|
# AppDBBackend defines the database backend type to use for the application and snapshots DBs.
|
||||||
# An empty string indicates that a fallback will be used.
|
# An empty string indicates that a fallback will be used.
|
||||||
# First fallback is the deprecated compile-time types.DBBackend value.
|
# First fallback is the deprecated compile-time types.DBBackend value.
|
||||||
|
|
|
@ -130,6 +130,10 @@ func (ms multiStore) SetIAVLCacheSize(size int) {
|
||||||
panic("not implemented")
|
panic("not implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ms multiStore) SetIAVLDisableFastNode(disable bool) {
|
||||||
|
panic("not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
func (ms multiStore) SetInitialVersion(version int64) error {
|
func (ms multiStore) SetInitialVersion(version int64) error {
|
||||||
panic("not implemented")
|
panic("not implemented")
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,6 +56,7 @@ const (
|
||||||
FlagIndexEvents = "index-events"
|
FlagIndexEvents = "index-events"
|
||||||
FlagMinRetainBlocks = "min-retain-blocks"
|
FlagMinRetainBlocks = "min-retain-blocks"
|
||||||
FlagIAVLCacheSize = "iavl-cache-size"
|
FlagIAVLCacheSize = "iavl-cache-size"
|
||||||
|
FlagIAVLFastNode = "iavl-disable-fastnode"
|
||||||
|
|
||||||
// state sync-related flags
|
// state sync-related flags
|
||||||
FlagStateSyncSnapshotInterval = "state-sync.snapshot-interval"
|
FlagStateSyncSnapshotInterval = "state-sync.snapshot-interval"
|
||||||
|
|
|
@ -46,7 +46,7 @@ require (
|
||||||
github.com/cosmos/go-bip39 v1.0.0 // indirect
|
github.com/cosmos/go-bip39 v1.0.0 // indirect
|
||||||
github.com/cosmos/gogoproto v1.4.2 // indirect
|
github.com/cosmos/gogoproto v1.4.2 // indirect
|
||||||
github.com/cosmos/gorocksdb v1.2.0 // indirect
|
github.com/cosmos/gorocksdb v1.2.0 // indirect
|
||||||
github.com/cosmos/iavl v0.19.1 // indirect
|
github.com/cosmos/iavl v0.19.2-0.20220916140702-9b6be3095313 // indirect
|
||||||
github.com/cosmos/ledger-cosmos-go v0.11.1 // indirect
|
github.com/cosmos/ledger-cosmos-go v0.11.1 // indirect
|
||||||
github.com/cosmos/ledger-go v0.9.2 // indirect
|
github.com/cosmos/ledger-go v0.9.2 // indirect
|
||||||
github.com/creachadair/taskgroup v0.3.2 // indirect
|
github.com/creachadair/taskgroup v0.3.2 // indirect
|
||||||
|
|
|
@ -193,8 +193,8 @@ github.com/cosmos/gogoproto v1.4.2 h1:UeGRcmFW41l0G0MiefWhkPEVEwvu78SZsHBvI78dAY
|
||||||
github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU=
|
github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU=
|
||||||
github.com/cosmos/gorocksdb v1.2.0 h1:d0l3jJG8M4hBouIZq0mDUHZ+zjOx044J3nGRskwTb4Y=
|
github.com/cosmos/gorocksdb v1.2.0 h1:d0l3jJG8M4hBouIZq0mDUHZ+zjOx044J3nGRskwTb4Y=
|
||||||
github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw=
|
github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw=
|
||||||
github.com/cosmos/iavl v0.19.1 h1:3gaq9b6SjiB0KBTygRnAvEGml2pQlu1TH8uma5g63Ys=
|
github.com/cosmos/iavl v0.19.2-0.20220916140702-9b6be3095313 h1:R7CnaI/0OLwOusy7n9750n8fqQ3yCQ8OJQI2L3ws9RA=
|
||||||
github.com/cosmos/iavl v0.19.1/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw=
|
github.com/cosmos/iavl v0.19.2-0.20220916140702-9b6be3095313/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw=
|
||||||
github.com/cosmos/keyring v1.2.0 h1:8C1lBP9xhImmIabyXW4c3vFjjLiBdGCmfLUfeZlV1Yo=
|
github.com/cosmos/keyring v1.2.0 h1:8C1lBP9xhImmIabyXW4c3vFjjLiBdGCmfLUfeZlV1Yo=
|
||||||
github.com/cosmos/keyring v1.2.0/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA=
|
github.com/cosmos/keyring v1.2.0/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA=
|
||||||
github.com/cosmos/ledger-cosmos-go v0.11.1 h1:9JIYsGnXP613pb2vPjFeMMjBI5lEDsEaF6oYorTy6J4=
|
github.com/cosmos/ledger-cosmos-go v0.11.1 h1:9JIYsGnXP613pb2vPjFeMMjBI5lEDsEaF6oYorTy6J4=
|
||||||
|
|
|
@ -145,6 +145,7 @@ func initAppConfig() (string, interface{}) {
|
||||||
//
|
//
|
||||||
// In simapp, we set the min gas prices to 0.
|
// In simapp, we set the min gas prices to 0.
|
||||||
srvCfg.MinGasPrices = "0stake"
|
srvCfg.MinGasPrices = "0stake"
|
||||||
|
// srvCfg.BaseConfig.IAVLDisableFastnNode = true // disable fastnode by default
|
||||||
|
|
||||||
customAppConfig := CustomAppConfig{
|
customAppConfig := CustomAppConfig{
|
||||||
Config: *srvCfg,
|
Config: *srvCfg,
|
||||||
|
@ -304,6 +305,7 @@ func newApp(
|
||||||
baseapp.SetIndexEvents(cast.ToStringSlice(appOpts.Get(server.FlagIndexEvents))),
|
baseapp.SetIndexEvents(cast.ToStringSlice(appOpts.Get(server.FlagIndexEvents))),
|
||||||
baseapp.SetSnapshot(snapshotStore, snapshotOptions),
|
baseapp.SetSnapshot(snapshotStore, snapshotOptions),
|
||||||
baseapp.SetIAVLCacheSize(cast.ToInt(appOpts.Get(server.FlagIAVLCacheSize))),
|
baseapp.SetIAVLCacheSize(cast.ToInt(appOpts.Get(server.FlagIAVLCacheSize))),
|
||||||
|
baseapp.SetIAVLDisableFastNode(cast.ToBool(appOpts.Get(server.FlagIAVLFastNode))),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ func TestGetOrSetStoreCache(t *testing.T) {
|
||||||
mngr := cache.NewCommitKVStoreCacheManager(cache.DefaultCommitKVStoreCacheSize)
|
mngr := cache.NewCommitKVStoreCacheManager(cache.DefaultCommitKVStoreCacheSize)
|
||||||
|
|
||||||
sKey := types.NewKVStoreKey("test")
|
sKey := types.NewKVStoreKey("test")
|
||||||
tree, err := iavl.NewMutableTree(db, 100)
|
tree, err := iavl.NewMutableTree(db, 100, false)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
store := iavlstore.UnsafeNewStore(tree)
|
store := iavlstore.UnsafeNewStore(tree)
|
||||||
store2 := mngr.GetStoreCache(sKey, store)
|
store2 := mngr.GetStoreCache(sKey, store)
|
||||||
|
@ -32,7 +32,7 @@ func TestUnwrap(t *testing.T) {
|
||||||
mngr := cache.NewCommitKVStoreCacheManager(cache.DefaultCommitKVStoreCacheSize)
|
mngr := cache.NewCommitKVStoreCacheManager(cache.DefaultCommitKVStoreCacheSize)
|
||||||
|
|
||||||
sKey := types.NewKVStoreKey("test")
|
sKey := types.NewKVStoreKey("test")
|
||||||
tree, err := iavl.NewMutableTree(db, 100)
|
tree, err := iavl.NewMutableTree(db, 100, false)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
store := iavlstore.UnsafeNewStore(tree)
|
store := iavlstore.UnsafeNewStore(tree)
|
||||||
_ = mngr.GetStoreCache(sKey, store)
|
_ = mngr.GetStoreCache(sKey, store)
|
||||||
|
@ -46,7 +46,7 @@ func TestStoreCache(t *testing.T) {
|
||||||
mngr := cache.NewCommitKVStoreCacheManager(cache.DefaultCommitKVStoreCacheSize)
|
mngr := cache.NewCommitKVStoreCacheManager(cache.DefaultCommitKVStoreCacheSize)
|
||||||
|
|
||||||
sKey := types.NewKVStoreKey("test")
|
sKey := types.NewKVStoreKey("test")
|
||||||
tree, err := iavl.NewMutableTree(db, 100)
|
tree, err := iavl.NewMutableTree(db, 100, false)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
store := iavlstore.UnsafeNewStore(tree)
|
store := iavlstore.UnsafeNewStore(tree)
|
||||||
kvStore := mngr.GetStoreCache(sKey, store)
|
kvStore := mngr.GetStoreCache(sKey, store)
|
||||||
|
|
|
@ -43,16 +43,16 @@ type Store struct {
|
||||||
// LoadStore returns an IAVL Store as a CommitKVStore. Internally, it will load the
|
// LoadStore returns an IAVL Store as a CommitKVStore. Internally, it will load the
|
||||||
// store's version (id) from the provided DB. An error is returned if the version
|
// store's version (id) from the provided DB. An error is returned if the version
|
||||||
// fails to load, or if called with a positive version on an empty tree.
|
// fails to load, or if called with a positive version on an empty tree.
|
||||||
func LoadStore(db dbm.DB, logger log.Logger, key types.StoreKey, id types.CommitID, lazyLoading bool, cacheSize int) (types.CommitKVStore, error) {
|
func LoadStore(db dbm.DB, logger log.Logger, key types.StoreKey, id types.CommitID, lazyLoading bool, cacheSize int, disableFastNode bool) (types.CommitKVStore, error) {
|
||||||
return LoadStoreWithInitialVersion(db, logger, key, id, lazyLoading, 0, cacheSize)
|
return LoadStoreWithInitialVersion(db, logger, key, id, lazyLoading, 0, cacheSize, disableFastNode)
|
||||||
}
|
}
|
||||||
|
|
||||||
// LoadStoreWithInitialVersion returns an IAVL Store as a CommitKVStore setting its initialVersion
|
// LoadStoreWithInitialVersion returns an IAVL Store as a CommitKVStore setting its initialVersion
|
||||||
// to the one given. Internally, it will load the store's version (id) from the
|
// to the one given. Internally, it will load the store's version (id) from the
|
||||||
// provided DB. An error is returned if the version fails to load, or if called with a positive
|
// provided DB. An error is returned if the version fails to load, or if called with a positive
|
||||||
// version on an empty tree.
|
// version on an empty tree.
|
||||||
func LoadStoreWithInitialVersion(db dbm.DB, logger log.Logger, key types.StoreKey, id types.CommitID, lazyLoading bool, initialVersion uint64, cacheSize int) (types.CommitKVStore, error) {
|
func LoadStoreWithInitialVersion(db dbm.DB, logger log.Logger, key types.StoreKey, id types.CommitID, lazyLoading bool, initialVersion uint64, cacheSize int, disableFastNode bool) (types.CommitKVStore, error) {
|
||||||
tree, err := iavl.NewMutableTreeWithOpts(db, cacheSize, &iavl.Options{InitialVersion: initialVersion})
|
tree, err := iavl.NewMutableTreeWithOpts(db, cacheSize, &iavl.Options{InitialVersion: initialVersion}, disableFastNode)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,7 +34,7 @@ func randBytes(numBytes int) []byte {
|
||||||
|
|
||||||
// make a tree with data from above and save it
|
// make a tree with data from above and save it
|
||||||
func newAlohaTree(t *testing.T, db dbm.DB) (*iavl.MutableTree, types.CommitID) {
|
func newAlohaTree(t *testing.T, db dbm.DB) (*iavl.MutableTree, types.CommitID) {
|
||||||
tree, err := iavl.NewMutableTree(db, cacheSize)
|
tree, err := iavl.NewMutableTree(db, cacheSize, false)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
for k, v := range treeData {
|
for k, v := range treeData {
|
||||||
|
@ -100,17 +100,17 @@ func TestLoadStore(t *testing.T) {
|
||||||
require.Equal(t, string(hcStore.Get([]byte("hello"))), "ciao")
|
require.Equal(t, string(hcStore.Get([]byte("hello"))), "ciao")
|
||||||
|
|
||||||
// Querying a new store at some previous non-pruned height H
|
// Querying a new store at some previous non-pruned height H
|
||||||
newHStore, err := LoadStore(db, log.NewNopLogger(), types.NewKVStoreKey("test"), cIDH, false, DefaultIAVLCacheSize)
|
newHStore, err := LoadStore(db, log.NewNopLogger(), types.NewKVStoreKey("test"), cIDH, false, DefaultIAVLCacheSize, false)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, string(newHStore.Get([]byte("hello"))), "hallo")
|
require.Equal(t, string(newHStore.Get([]byte("hello"))), "hallo")
|
||||||
|
|
||||||
// Querying a new store at some previous pruned height Hp
|
// Querying a new store at some previous pruned height Hp
|
||||||
newHpStore, err := LoadStore(db, log.NewNopLogger(), types.NewKVStoreKey("test"), cIDHp, false, DefaultIAVLCacheSize)
|
newHpStore, err := LoadStore(db, log.NewNopLogger(), types.NewKVStoreKey("test"), cIDHp, false, DefaultIAVLCacheSize, false)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, string(newHpStore.Get([]byte("hello"))), "hola")
|
require.Equal(t, string(newHpStore.Get([]byte("hello"))), "hola")
|
||||||
|
|
||||||
// Querying a new store at current height H
|
// Querying a new store at current height H
|
||||||
newHcStore, err := LoadStore(db, log.NewNopLogger(), types.NewKVStoreKey("test"), cIDHc, false, DefaultIAVLCacheSize)
|
newHcStore, err := LoadStore(db, log.NewNopLogger(), types.NewKVStoreKey("test"), cIDHc, false, DefaultIAVLCacheSize, false)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, string(newHcStore.Get([]byte("hello"))), "ciao")
|
require.Equal(t, string(newHcStore.Get([]byte("hello"))), "ciao")
|
||||||
}
|
}
|
||||||
|
@ -281,7 +281,7 @@ func TestIAVLIterator(t *testing.T) {
|
||||||
func TestIAVLReverseIterator(t *testing.T) {
|
func TestIAVLReverseIterator(t *testing.T) {
|
||||||
db := dbm.NewMemDB()
|
db := dbm.NewMemDB()
|
||||||
|
|
||||||
tree, err := iavl.NewMutableTree(db, cacheSize)
|
tree, err := iavl.NewMutableTree(db, cacheSize, false)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
iavlStore := UnsafeNewStore(tree)
|
iavlStore := UnsafeNewStore(tree)
|
||||||
|
@ -314,7 +314,7 @@ func TestIAVLReverseIterator(t *testing.T) {
|
||||||
|
|
||||||
func TestIAVLPrefixIterator(t *testing.T) {
|
func TestIAVLPrefixIterator(t *testing.T) {
|
||||||
db := dbm.NewMemDB()
|
db := dbm.NewMemDB()
|
||||||
tree, err := iavl.NewMutableTree(db, cacheSize)
|
tree, err := iavl.NewMutableTree(db, cacheSize, false)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
iavlStore := UnsafeNewStore(tree)
|
iavlStore := UnsafeNewStore(tree)
|
||||||
|
@ -378,7 +378,7 @@ func TestIAVLPrefixIterator(t *testing.T) {
|
||||||
|
|
||||||
func TestIAVLReversePrefixIterator(t *testing.T) {
|
func TestIAVLReversePrefixIterator(t *testing.T) {
|
||||||
db := dbm.NewMemDB()
|
db := dbm.NewMemDB()
|
||||||
tree, err := iavl.NewMutableTree(db, cacheSize)
|
tree, err := iavl.NewMutableTree(db, cacheSize, false)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
iavlStore := UnsafeNewStore(tree)
|
iavlStore := UnsafeNewStore(tree)
|
||||||
|
@ -446,7 +446,7 @@ func nextVersion(iavl *Store) {
|
||||||
|
|
||||||
func TestIAVLNoPrune(t *testing.T) {
|
func TestIAVLNoPrune(t *testing.T) {
|
||||||
db := dbm.NewMemDB()
|
db := dbm.NewMemDB()
|
||||||
tree, err := iavl.NewMutableTree(db, cacheSize)
|
tree, err := iavl.NewMutableTree(db, cacheSize, false)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
iavlStore := UnsafeNewStore(tree)
|
iavlStore := UnsafeNewStore(tree)
|
||||||
|
@ -465,7 +465,7 @@ func TestIAVLNoPrune(t *testing.T) {
|
||||||
|
|
||||||
func TestIAVLStoreQuery(t *testing.T) {
|
func TestIAVLStoreQuery(t *testing.T) {
|
||||||
db := dbm.NewMemDB()
|
db := dbm.NewMemDB()
|
||||||
tree, err := iavl.NewMutableTree(db, cacheSize)
|
tree, err := iavl.NewMutableTree(db, cacheSize, false)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
iavlStore := UnsafeNewStore(tree)
|
iavlStore := UnsafeNewStore(tree)
|
||||||
|
@ -569,7 +569,7 @@ func BenchmarkIAVLIteratorNext(b *testing.B) {
|
||||||
b.ReportAllocs()
|
b.ReportAllocs()
|
||||||
db := dbm.NewMemDB()
|
db := dbm.NewMemDB()
|
||||||
treeSize := 1000
|
treeSize := 1000
|
||||||
tree, err := iavl.NewMutableTree(db, cacheSize)
|
tree, err := iavl.NewMutableTree(db, cacheSize, false)
|
||||||
require.NoError(b, err)
|
require.NoError(b, err)
|
||||||
|
|
||||||
for i := 0; i < treeSize; i++ {
|
for i := 0; i < treeSize; i++ {
|
||||||
|
@ -603,7 +603,7 @@ func TestSetInitialVersion(t *testing.T) {
|
||||||
{
|
{
|
||||||
"works with a mutable tree",
|
"works with a mutable tree",
|
||||||
func(db *dbm.MemDB) *Store {
|
func(db *dbm.MemDB) *Store {
|
||||||
tree, err := iavl.NewMutableTree(db, cacheSize)
|
tree, err := iavl.NewMutableTree(db, cacheSize, false)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
store := UnsafeNewStore(tree)
|
store := UnsafeNewStore(tree)
|
||||||
|
|
||||||
|
@ -613,7 +613,7 @@ func TestSetInitialVersion(t *testing.T) {
|
||||||
{
|
{
|
||||||
"throws error on immutable tree",
|
"throws error on immutable tree",
|
||||||
func(db *dbm.MemDB) *Store {
|
func(db *dbm.MemDB) *Store {
|
||||||
tree, err := iavl.NewMutableTree(db, cacheSize)
|
tree, err := iavl.NewMutableTree(db, cacheSize, false)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
store := UnsafeNewStore(tree)
|
store := UnsafeNewStore(tree)
|
||||||
_, version, err := store.tree.SaveVersion()
|
_, version, err := store.tree.SaveVersion()
|
||||||
|
|
|
@ -10,7 +10,7 @@ import (
|
||||||
|
|
||||||
func TestImmutableTreePanics(t *testing.T) {
|
func TestImmutableTreePanics(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
immTree := iavl.NewImmutableTree(dbm.NewMemDB(), 100)
|
immTree := iavl.NewImmutableTree(dbm.NewMemDB(), 100, false)
|
||||||
it := &immutableTree{immTree}
|
it := &immutableTree{immTree}
|
||||||
require.Panics(t, func() { it.Set([]byte{}, []byte{}) })
|
require.Panics(t, func() { it.Set([]byte{}, []byte{}) })
|
||||||
require.Panics(t, func() { it.Remove([]byte{}) })
|
require.Panics(t, func() { it.Remove([]byte{}) })
|
||||||
|
|
|
@ -90,7 +90,7 @@ func testPrefixStore(t *testing.T, baseStore types.KVStore, prefix []byte) {
|
||||||
|
|
||||||
func TestIAVLStorePrefix(t *testing.T) {
|
func TestIAVLStorePrefix(t *testing.T) {
|
||||||
db := dbm.NewMemDB()
|
db := dbm.NewMemDB()
|
||||||
tree, err := tiavl.NewMutableTree(db, cacheSize)
|
tree, err := tiavl.NewMutableTree(db, cacheSize, false)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
iavlStore := iavl.UnsafeNewStore(tree)
|
iavlStore := iavl.UnsafeNewStore(tree)
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ import (
|
||||||
func TestVerifyIAVLStoreQueryProof(t *testing.T) {
|
func TestVerifyIAVLStoreQueryProof(t *testing.T) {
|
||||||
// Create main tree for testing.
|
// Create main tree for testing.
|
||||||
db := dbm.NewMemDB()
|
db := dbm.NewMemDB()
|
||||||
iStore, err := iavl.LoadStore(db, log.NewNopLogger(), types.NewKVStoreKey("test"), types.CommitID{}, false, iavl.DefaultIAVLCacheSize)
|
iStore, err := iavl.LoadStore(db, log.NewNopLogger(), types.NewKVStoreKey("test"), types.CommitID{}, false, iavl.DefaultIAVLCacheSize, false)
|
||||||
store := iStore.(*iavl.Store)
|
store := iStore.(*iavl.Store)
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
store.Set([]byte("MYKEY"), []byte("MYVALUE"))
|
store.Set([]byte("MYKEY"), []byte("MYVALUE"))
|
||||||
|
|
|
@ -35,21 +35,24 @@ const (
|
||||||
commitInfoKeyFmt = "s/%d" // s/<version>
|
commitInfoKeyFmt = "s/%d" // s/<version>
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const iavlDisablefastNodeDefault = false
|
||||||
|
|
||||||
// Store is composed of many CommitStores. Name contrasts with
|
// Store is composed of many CommitStores. Name contrasts with
|
||||||
// cacheMultiStore which is used for branching other MultiStores. It implements
|
// cacheMultiStore which is used for branching other MultiStores. It implements
|
||||||
// the CommitMultiStore interface.
|
// the CommitMultiStore interface.
|
||||||
type Store struct {
|
type Store struct {
|
||||||
db dbm.DB
|
db dbm.DB
|
||||||
logger log.Logger
|
logger log.Logger
|
||||||
lastCommitInfo *types.CommitInfo
|
lastCommitInfo *types.CommitInfo
|
||||||
pruningManager *pruning.Manager
|
pruningManager *pruning.Manager
|
||||||
iavlCacheSize int
|
iavlCacheSize int
|
||||||
storesParams map[types.StoreKey]storeParams
|
iavlDisableFastNode bool
|
||||||
stores map[types.StoreKey]types.CommitKVStore
|
storesParams map[types.StoreKey]storeParams
|
||||||
keysByName map[string]types.StoreKey
|
stores map[types.StoreKey]types.CommitKVStore
|
||||||
lazyLoading bool
|
keysByName map[string]types.StoreKey
|
||||||
initialVersion int64
|
lazyLoading bool
|
||||||
removalMap map[types.StoreKey]bool
|
initialVersion int64
|
||||||
|
removalMap map[types.StoreKey]bool
|
||||||
|
|
||||||
traceWriter io.Writer
|
traceWriter io.Writer
|
||||||
traceContext types.TraceContext
|
traceContext types.TraceContext
|
||||||
|
@ -71,15 +74,16 @@ var (
|
||||||
// LoadVersion must be called.
|
// LoadVersion must be called.
|
||||||
func NewStore(db dbm.DB, logger log.Logger) *Store {
|
func NewStore(db dbm.DB, logger log.Logger) *Store {
|
||||||
return &Store{
|
return &Store{
|
||||||
db: db,
|
db: db,
|
||||||
logger: logger,
|
logger: logger,
|
||||||
iavlCacheSize: iavl.DefaultIAVLCacheSize,
|
iavlCacheSize: iavl.DefaultIAVLCacheSize,
|
||||||
storesParams: make(map[types.StoreKey]storeParams),
|
iavlDisableFastNode: iavlDisablefastNodeDefault,
|
||||||
stores: make(map[types.StoreKey]types.CommitKVStore),
|
storesParams: make(map[types.StoreKey]storeParams),
|
||||||
keysByName: make(map[string]types.StoreKey),
|
stores: make(map[types.StoreKey]types.CommitKVStore),
|
||||||
listeners: make(map[types.StoreKey][]types.WriteListener),
|
keysByName: make(map[string]types.StoreKey),
|
||||||
removalMap: make(map[types.StoreKey]bool),
|
listeners: make(map[types.StoreKey][]types.WriteListener),
|
||||||
pruningManager: pruning.NewManager(db, logger),
|
removalMap: make(map[types.StoreKey]bool),
|
||||||
|
pruningManager: pruning.NewManager(db, logger),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,6 +109,10 @@ func (rs *Store) SetIAVLCacheSize(cacheSize int) {
|
||||||
rs.iavlCacheSize = cacheSize
|
rs.iavlCacheSize = cacheSize
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (rs *Store) SetIAVLDisableFastNode(disableFastNode bool) {
|
||||||
|
rs.iavlDisableFastNode = disableFastNode
|
||||||
|
}
|
||||||
|
|
||||||
// SetLazyLoading sets if the iavl store should be loaded lazily or not
|
// SetLazyLoading sets if the iavl store should be loaded lazily or not
|
||||||
func (rs *Store) SetLazyLoading(lazyLoading bool) {
|
func (rs *Store) SetLazyLoading(lazyLoading bool) {
|
||||||
rs.lazyLoading = lazyLoading
|
rs.lazyLoading = lazyLoading
|
||||||
|
@ -876,9 +884,9 @@ func (rs *Store) loadCommitStoreFromParams(key types.StoreKey, id types.CommitID
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
if params.initialVersion == 0 {
|
if params.initialVersion == 0 {
|
||||||
store, err = iavl.LoadStore(db, rs.logger, key, id, rs.lazyLoading, rs.iavlCacheSize)
|
store, err = iavl.LoadStore(db, rs.logger, key, id, rs.lazyLoading, rs.iavlCacheSize, rs.iavlDisableFastNode)
|
||||||
} else {
|
} else {
|
||||||
store, err = iavl.LoadStoreWithInitialVersion(db, rs.logger, key, id, rs.lazyLoading, params.initialVersion, rs.iavlCacheSize)
|
store, err = iavl.LoadStoreWithInitialVersion(db, rs.logger, key, id, rs.lazyLoading, params.initialVersion, rs.iavlCacheSize, rs.iavlDisableFastNode)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -13,7 +13,7 @@ import (
|
||||||
|
|
||||||
func newMemTestKVStore(t *testing.T) types.KVStore {
|
func newMemTestKVStore(t *testing.T) types.KVStore {
|
||||||
db := dbm.NewMemDB()
|
db := dbm.NewMemDB()
|
||||||
store, err := iavl.LoadStore(db, log.NewNopLogger(), types.NewKVStoreKey("test"), types.CommitID{}, false, iavl.DefaultIAVLCacheSize)
|
store, err := iavl.LoadStore(db, log.NewNopLogger(), types.NewKVStoreKey("test"), types.CommitID{}, false, iavl.DefaultIAVLCacheSize, false)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
return store
|
return store
|
||||||
}
|
}
|
||||||
|
|
|
@ -189,6 +189,9 @@ type CommitMultiStore interface {
|
||||||
// SetIAVLCacheSize sets the cache size of the IAVL tree.
|
// SetIAVLCacheSize sets the cache size of the IAVL tree.
|
||||||
SetIAVLCacheSize(size int)
|
SetIAVLCacheSize(size int)
|
||||||
|
|
||||||
|
// SetIAVLDisableFastNode enables/disables fastnode feature on iavl.
|
||||||
|
SetIAVLDisableFastNode(disable bool)
|
||||||
|
|
||||||
// RollbackToVersion rollback the db to specific version(height).
|
// RollbackToVersion rollback the db to specific version(height).
|
||||||
RollbackToVersion(version int64) error
|
RollbackToVersion(version int64) error
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,7 +44,7 @@ require (
|
||||||
github.com/cosmos/cosmos-proto v1.0.0-alpha7 // indirect
|
github.com/cosmos/cosmos-proto v1.0.0-alpha7 // indirect
|
||||||
github.com/cosmos/go-bip39 v1.0.0 // indirect
|
github.com/cosmos/go-bip39 v1.0.0 // indirect
|
||||||
github.com/cosmos/gorocksdb v1.2.0 // indirect
|
github.com/cosmos/gorocksdb v1.2.0 // indirect
|
||||||
github.com/cosmos/iavl v0.19.1 // indirect
|
github.com/cosmos/iavl v0.19.2-0.20220916140702-9b6be3095313 // indirect
|
||||||
github.com/cosmos/ledger-cosmos-go v0.11.1 // indirect
|
github.com/cosmos/ledger-cosmos-go v0.11.1 // indirect
|
||||||
github.com/cosmos/ledger-go v0.9.2 // indirect
|
github.com/cosmos/ledger-go v0.9.2 // indirect
|
||||||
github.com/creachadair/taskgroup v0.3.2 // indirect
|
github.com/creachadair/taskgroup v0.3.2 // indirect
|
||||||
|
|
|
@ -193,8 +193,8 @@ github.com/cosmos/gogoproto v1.4.2 h1:UeGRcmFW41l0G0MiefWhkPEVEwvu78SZsHBvI78dAY
|
||||||
github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU=
|
github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU=
|
||||||
github.com/cosmos/gorocksdb v1.2.0 h1:d0l3jJG8M4hBouIZq0mDUHZ+zjOx044J3nGRskwTb4Y=
|
github.com/cosmos/gorocksdb v1.2.0 h1:d0l3jJG8M4hBouIZq0mDUHZ+zjOx044J3nGRskwTb4Y=
|
||||||
github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw=
|
github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw=
|
||||||
github.com/cosmos/iavl v0.19.1 h1:3gaq9b6SjiB0KBTygRnAvEGml2pQlu1TH8uma5g63Ys=
|
github.com/cosmos/iavl v0.19.2-0.20220916140702-9b6be3095313 h1:R7CnaI/0OLwOusy7n9750n8fqQ3yCQ8OJQI2L3ws9RA=
|
||||||
github.com/cosmos/iavl v0.19.1/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw=
|
github.com/cosmos/iavl v0.19.2-0.20220916140702-9b6be3095313/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw=
|
||||||
github.com/cosmos/keyring v1.2.0 h1:8C1lBP9xhImmIabyXW4c3vFjjLiBdGCmfLUfeZlV1Yo=
|
github.com/cosmos/keyring v1.2.0 h1:8C1lBP9xhImmIabyXW4c3vFjjLiBdGCmfLUfeZlV1Yo=
|
||||||
github.com/cosmos/keyring v1.2.0/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA=
|
github.com/cosmos/keyring v1.2.0/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA=
|
||||||
github.com/cosmos/ledger-cosmos-go v0.11.1 h1:9JIYsGnXP613pb2vPjFeMMjBI5lEDsEaF6oYorTy6J4=
|
github.com/cosmos/ledger-cosmos-go v0.11.1 h1:9JIYsGnXP613pb2vPjFeMMjBI5lEDsEaF6oYorTy6J4=
|
||||||
|
|
Loading…
Reference in New Issue