feat(runtime,runtime/v2): skip store for specified modules (#20409)
This commit is contained in:
+47
-10
@@ -3,6 +3,7 @@ package runtime
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"slices"
|
||||
|
||||
"github.com/cosmos/gogoproto/proto"
|
||||
"google.golang.org/protobuf/reflect/protodesc"
|
||||
@@ -192,6 +193,10 @@ func ProvideKVStoreKey(
|
||||
key depinject.ModuleKey,
|
||||
app *AppBuilder,
|
||||
) *storetypes.KVStoreKey {
|
||||
if slices.Contains(config.SkipStoreKeys, key.Name()) {
|
||||
return nil
|
||||
}
|
||||
|
||||
override := storeKeyOverride(config, key.Name())
|
||||
|
||||
var storeKeyName string
|
||||
@@ -206,13 +211,29 @@ func ProvideKVStoreKey(
|
||||
return storeKey
|
||||
}
|
||||
|
||||
func ProvideTransientStoreKey(key depinject.ModuleKey, app *AppBuilder) *storetypes.TransientStoreKey {
|
||||
func ProvideTransientStoreKey(
|
||||
config *runtimev1alpha1.Module,
|
||||
key depinject.ModuleKey,
|
||||
app *AppBuilder,
|
||||
) *storetypes.TransientStoreKey {
|
||||
if slices.Contains(config.SkipStoreKeys, key.Name()) {
|
||||
return nil
|
||||
}
|
||||
|
||||
storeKey := storetypes.NewTransientStoreKey(fmt.Sprintf("transient:%s", key.Name()))
|
||||
registerStoreKey(app, storeKey)
|
||||
return storeKey
|
||||
}
|
||||
|
||||
func ProvideMemoryStoreKey(key depinject.ModuleKey, app *AppBuilder) *storetypes.MemoryStoreKey {
|
||||
func ProvideMemoryStoreKey(
|
||||
config *runtimev1alpha1.Module,
|
||||
key depinject.ModuleKey,
|
||||
app *AppBuilder,
|
||||
) *storetypes.MemoryStoreKey {
|
||||
if slices.Contains(config.SkipStoreKeys, key.Name()) {
|
||||
return nil
|
||||
}
|
||||
|
||||
storeKey := storetypes.NewMemoryStoreKey(fmt.Sprintf("memory:%s", key.Name()))
|
||||
registerStoreKey(app, storeKey)
|
||||
return storeKey
|
||||
@@ -234,23 +255,39 @@ func ProvideEnvironment(
|
||||
msgServiceRouter *baseapp.MsgServiceRouter,
|
||||
queryServiceRouter *baseapp.GRPCQueryRouter,
|
||||
) (store.KVStoreService, store.MemoryStoreService, appmodule.Environment) {
|
||||
storeKey := ProvideKVStoreKey(config, key, app)
|
||||
kvService := kvStoreService{key: storeKey}
|
||||
var (
|
||||
kvService store.KVStoreService = failingStoreService{}
|
||||
memKvService store.MemoryStoreService = failingStoreService{}
|
||||
)
|
||||
|
||||
memStoreKey := ProvideMemoryStoreKey(key, app)
|
||||
memStoreService := memStoreService{key: memStoreKey}
|
||||
// skips modules that have no store
|
||||
if !slices.Contains(config.SkipStoreKeys, key.Name()) {
|
||||
storeKey := ProvideKVStoreKey(config, key, app)
|
||||
kvService = kvStoreService{key: storeKey}
|
||||
|
||||
return kvService, memStoreService, NewEnvironment(
|
||||
memStoreKey := ProvideMemoryStoreKey(config, key, app)
|
||||
memKvService = memStoreService{key: memStoreKey}
|
||||
}
|
||||
|
||||
return kvService, memKvService, NewEnvironment(
|
||||
kvService,
|
||||
logger.With(log.ModuleKey, fmt.Sprintf("x/%s", key.Name())),
|
||||
EnvWithMsgRouterService(msgServiceRouter),
|
||||
EnvWithQueryRouterService(queryServiceRouter),
|
||||
EnvWithMemStoreService(memStoreService),
|
||||
EnvWithMemStoreService(memKvService),
|
||||
)
|
||||
}
|
||||
|
||||
func ProvideTransientStoreService(key depinject.ModuleKey, app *AppBuilder) store.TransientStoreService {
|
||||
storeKey := ProvideTransientStoreKey(key, app)
|
||||
func ProvideTransientStoreService(
|
||||
config *runtimev1alpha1.Module,
|
||||
key depinject.ModuleKey,
|
||||
app *AppBuilder,
|
||||
) store.TransientStoreService {
|
||||
storeKey := ProvideTransientStoreKey(config, key, app)
|
||||
if storeKey == nil {
|
||||
return failingStoreService{}
|
||||
}
|
||||
|
||||
return transientStoreService{key: storeKey}
|
||||
}
|
||||
|
||||
|
||||
@@ -48,6 +48,20 @@ func (t transientStoreService) OpenTransientStore(ctx context.Context) store.KVS
|
||||
return newKVStore(sdk.UnwrapSDKContext(ctx).KVStore(t.key))
|
||||
}
|
||||
|
||||
type failingStoreService struct{}
|
||||
|
||||
func (failingStoreService) OpenKVStore(ctx context.Context) store.KVStore {
|
||||
panic("kv store service not available for this module: verify runtime `skip_store_keys` app config if not expected")
|
||||
}
|
||||
|
||||
func (failingStoreService) OpenMemoryStore(ctx context.Context) store.KVStore {
|
||||
panic("memory kv store service not available for this module: verify runtime `skip_store_keys` app config if not expected")
|
||||
}
|
||||
|
||||
func (failingStoreService) OpenTransientStore(ctx context.Context) store.KVStore {
|
||||
panic("transient kv store service not available for this module: verify runtime `skip_store_keys` app config if not expected")
|
||||
}
|
||||
|
||||
// CoreKVStore is a wrapper of Core/Store kvstore interface
|
||||
// Remove after https://github.com/cosmos/cosmos-sdk/issues/14714 is closed
|
||||
type coreKVStore struct {
|
||||
|
||||
+24
-14
@@ -3,6 +3,7 @@ package runtime
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"slices"
|
||||
|
||||
"github.com/cosmos/gogoproto/proto"
|
||||
"google.golang.org/grpc"
|
||||
@@ -185,19 +186,28 @@ func ProvideEnvironment(logger log.Logger, config *runtimev2.Module, key depinje
|
||||
store.KVStoreService,
|
||||
store.MemoryStoreService,
|
||||
) {
|
||||
var kvStoreKey string
|
||||
storeKeyOverride := storeKeyOverride(config, key.Name())
|
||||
if storeKeyOverride != nil {
|
||||
kvStoreKey = storeKeyOverride.KvStoreKey
|
||||
} else {
|
||||
kvStoreKey = key.Name()
|
||||
}
|
||||
registerStoreKey(appBuilder, kvStoreKey)
|
||||
kvService := stf.NewKVStoreService([]byte(kvStoreKey))
|
||||
var (
|
||||
kvService store.KVStoreService = failingStoreService{}
|
||||
memKvService store.MemoryStoreService = failingStoreService{}
|
||||
)
|
||||
|
||||
memStoreKey := fmt.Sprintf("memory:%s", key.Name())
|
||||
registerStoreKey(appBuilder, memStoreKey)
|
||||
memService := stf.NewMemoryStoreService([]byte(memStoreKey))
|
||||
// skips modules that have no store
|
||||
if !slices.Contains(config.SkipStoreKeys, key.Name()) {
|
||||
var kvStoreKey string
|
||||
storeKeyOverride := storeKeyOverride(config, key.Name())
|
||||
if storeKeyOverride != nil {
|
||||
kvStoreKey = storeKeyOverride.KvStoreKey
|
||||
} else {
|
||||
kvStoreKey = key.Name()
|
||||
}
|
||||
|
||||
registerStoreKey(appBuilder, kvStoreKey)
|
||||
kvService = stf.NewKVStoreService([]byte(kvStoreKey))
|
||||
|
||||
memStoreKey := fmt.Sprintf("memory:%s", key.Name())
|
||||
registerStoreKey(appBuilder, memStoreKey)
|
||||
memKvService = stf.NewMemoryStoreService([]byte(memStoreKey))
|
||||
}
|
||||
|
||||
env := appmodulev2.Environment{
|
||||
Logger: logger,
|
||||
@@ -209,10 +219,10 @@ func ProvideEnvironment(logger log.Logger, config *runtimev2.Module, key depinje
|
||||
MsgRouterService: stf.NewMsgRouterService(appBuilder.app.msgRouterBuilder),
|
||||
TransactionService: services.NewContextAwareTransactionService(),
|
||||
KVStoreService: kvService,
|
||||
MemStoreService: memService,
|
||||
MemStoreService: memKvService,
|
||||
}
|
||||
|
||||
return env, kvService, memService
|
||||
return env, kvService, memKvService
|
||||
}
|
||||
|
||||
func registerStoreKey(wrapper *AppBuilder, key string) {
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
package runtime
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"cosmossdk.io/core/store"
|
||||
)
|
||||
|
||||
type failingStoreService struct{}
|
||||
|
||||
func (failingStoreService) OpenKVStore(ctx context.Context) store.KVStore {
|
||||
panic("kv store service not available for this module: verify runtime `skip_store_keys` app config if not expected")
|
||||
}
|
||||
|
||||
func (failingStoreService) OpenMemoryStore(ctx context.Context) store.KVStore {
|
||||
panic("memory kv store service not available for this module: verify runtime `skip_store_keys` app config if not expected")
|
||||
}
|
||||
|
||||
func (failingStoreService) OpenTransientStore(ctx context.Context) store.KVStore {
|
||||
panic("transient kv store service not available for this module: verify runtime `skip_store_keys` app config if not expected")
|
||||
}
|
||||
Reference in New Issue
Block a user