feat(schema/appdata)!: efficiency & data model improvements aligned with server/v2 (#21305)

This commit is contained in:
Aaron Craelius
2024-08-20 14:49:06 +00:00
committed by GitHub
parent 27d3d4892b
commit da27d8b9a1
11 changed files with 244 additions and 39 deletions
+7 -5
View File
@@ -297,12 +297,14 @@ func (t testStore) GetUInt64(key []byte) uint64 {
func (t testStore) Set(key, value []byte) {
if t.listener.OnKVPair != nil {
err := t.listener.OnKVPair(appdata.KVPairData{Updates: []appdata.ModuleKVPairUpdate{
err := t.listener.OnKVPair(appdata.KVPairData{Updates: []appdata.ActorKVPairUpdate{
{
ModuleName: t.modName,
Update: schema.KVPairUpdate{
Key: key,
Value: value,
Actor: []byte(t.modName),
StateChanges: []schema.KVPairUpdate{
{
Key: key,
Value: value,
},
},
},
}})
+36 -22
View File
@@ -23,6 +23,7 @@ func Middleware(target appdata.Listener, resolver DecoderResolver, opts Middlewa
onKVPair := target.OnKVPair
moduleCodecs := map[string]*schema.ModuleCodec{}
moduleNames := map[string]string{}
target.OnKVPair = func(data appdata.KVPairData) error {
// first forward kv pair updates
@@ -34,17 +35,28 @@ func Middleware(target appdata.Listener, resolver DecoderResolver, opts Middlewa
}
for _, kvUpdate := range data.Updates {
// look for an existing codec
pcdc, ok := moduleCodecs[kvUpdate.ModuleName]
moduleName, ok := moduleNames[string(kvUpdate.Actor)]
if !ok {
if opts.ModuleFilter != nil && !opts.ModuleFilter(kvUpdate.ModuleName) {
var err error
moduleName, err = resolver.DecodeModuleName(kvUpdate.Actor)
if err != nil {
return err
}
moduleNames[string(kvUpdate.Actor)] = moduleName
}
// look for an existing codec
pcdc, ok := moduleCodecs[moduleName]
if !ok {
if opts.ModuleFilter != nil && !opts.ModuleFilter(moduleName) {
// we don't care about this module so store nil and continue
moduleCodecs[kvUpdate.ModuleName] = nil
moduleCodecs[moduleName] = nil
continue
}
// look for a new codec
cdc, found, err := resolver.LookupDecoder(kvUpdate.ModuleName)
cdc, found, err := resolver.LookupDecoder(moduleName)
if err != nil {
return err
}
@@ -52,16 +64,16 @@ func Middleware(target appdata.Listener, resolver DecoderResolver, opts Middlewa
if !found {
// store nil to indicate we've seen this module and don't have a codec
// and keep processing the kv updates
moduleCodecs[kvUpdate.ModuleName] = nil
moduleCodecs[moduleName] = nil
continue
}
pcdc = &cdc
moduleCodecs[kvUpdate.ModuleName] = pcdc
moduleCodecs[moduleName] = pcdc
if initializeModuleData != nil {
err = initializeModuleData(appdata.ModuleInitializationData{
ModuleName: kvUpdate.ModuleName,
ModuleName: moduleName,
Schema: cdc.Schema,
})
if err != nil {
@@ -80,22 +92,24 @@ func Middleware(target appdata.Listener, resolver DecoderResolver, opts Middlewa
continue
}
updates, err := pcdc.KVDecoder(kvUpdate.Update)
if err != nil {
return err
}
for _, u := range kvUpdate.StateChanges {
updates, err := pcdc.KVDecoder(u)
if err != nil {
return err
}
if len(updates) == 0 {
// no updates
continue
}
if len(updates) == 0 {
// no updates
continue
}
err = target.OnObjectUpdate(appdata.ObjectUpdateData{
ModuleName: kvUpdate.ModuleName,
Updates: updates,
})
if err != nil {
return err
err = target.OnObjectUpdate(appdata.ObjectUpdateData{
ModuleName: moduleName,
Updates: updates,
})
if err != nil {
return err
}
}
}
+21
View File
@@ -1,6 +1,7 @@
package decoding
import (
"fmt"
"sort"
"cosmossdk.io/schema"
@@ -8,6 +9,12 @@ import (
// DecoderResolver is an interface that allows indexers to discover and use module decoders.
type DecoderResolver interface {
// DecodeModuleName decodes a module name from a byte slice passed as the actor in a KVPairUpdate.
DecodeModuleName([]byte) (string, error)
// EncodeModuleName encodes a module name into a byte slice that can be used as the actor in a KVPairUpdate.
EncodeModuleName(string) ([]byte, error)
// IterateAll iterates over all available module decoders.
IterateAll(func(moduleName string, cdc schema.ModuleCodec) error) error
@@ -27,6 +34,20 @@ type moduleSetDecoderResolver struct {
moduleSet map[string]interface{}
}
func (a moduleSetDecoderResolver) DecodeModuleName(bytes []byte) (string, error) {
if _, ok := a.moduleSet[string(bytes)]; ok {
return string(bytes), nil
}
return "", fmt.Errorf("module %s not found", bytes)
}
func (a moduleSetDecoderResolver) EncodeModuleName(s string) ([]byte, error) {
if _, ok := a.moduleSet[s]; ok {
return []byte(s), nil
}
return nil, fmt.Errorf("module %s not found", s)
}
func (a moduleSetDecoderResolver) IterateAll(f func(string, schema.ModuleCodec) error) error {
keys := make([]string, 0, len(a.moduleSet))
for k := range a.moduleSet {