feat(runtime,runtime/v2): skip store for specified modules (#20409)

This commit is contained in:
Julien Robert
2024-05-27 11:33:25 +00:00
committed by GitHub
parent fe6361b617
commit 190b20c398
13 changed files with 537 additions and 102 deletions
+47 -10
View File
@@ -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}
}
+14
View File
@@ -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
View File
@@ -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) {
+21
View File
@@ -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")
}