Skip to content

Commit 0611fbc

Browse files
fix(runtime/v2): bring back concurrent export genesis in v2 (#21554)
Co-authored-by: Matt Kocubinski <mkocubinski@gmail.com>
1 parent bed3ac0 commit 0611fbc

File tree

2 files changed

+38
-16
lines changed

2 files changed

+38
-16
lines changed

runtime/v2/builder.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -193,17 +193,17 @@ func (a *AppBuilder[T]) Build(opts ...AppBuilderOption[T]) (*App[T], error) {
193193
return genesisState, err
194194
},
195195
ExportGenesis: func(ctx context.Context, version uint64) ([]byte, error) {
196-
_, state, err := a.app.db.StateLatest()
196+
state, err := a.app.db.StateAt(version)
197197
if err != nil {
198-
return nil, fmt.Errorf("unable to get latest state: %w", err)
198+
return nil, fmt.Errorf("unable to get state at given version: %w", err)
199199
}
200-
genesisCtx := services.NewGenesisContext(a.branch(state))
201200

202-
var genesisJson map[string]json.RawMessage
203-
_, err = genesisCtx.Run(ctx, func(ctx context.Context) error {
204-
genesisJson, err = a.app.moduleManager.ExportGenesisForModules(ctx)
205-
return err
206-
})
201+
genesisJson, err := a.app.moduleManager.ExportGenesisForModules(
202+
ctx,
203+
func() store.WriterMap {
204+
return a.branch(state)
205+
},
206+
)
207207
if err != nil {
208208
return nil, fmt.Errorf("failed to export genesis: %w", err)
209209
}

runtime/v2/manager.go

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@ import (
2121
"cosmossdk.io/core/appmodule"
2222
appmodulev2 "cosmossdk.io/core/appmodule/v2"
2323
"cosmossdk.io/core/registry"
24+
"cosmossdk.io/core/store"
2425
"cosmossdk.io/core/transaction"
2526
"cosmossdk.io/log"
27+
"cosmossdk.io/runtime/v2/services"
2628
"cosmossdk.io/server/v2/stf"
2729
)
2830

@@ -193,6 +195,7 @@ func (m *MM[T]) InitGenesisJSON(
193195
// ExportGenesisForModules performs export genesis functionality for modules
194196
func (m *MM[T]) ExportGenesisForModules(
195197
ctx context.Context,
198+
stateFactory func() store.WriterMap,
196199
modulesToExport ...string,
197200
) (map[string]json.RawMessage, error) {
198201
if len(modulesToExport) == 0 {
@@ -203,17 +206,19 @@ func (m *MM[T]) ExportGenesisForModules(
203206
return nil, err
204207
}
205208

209+
type genesisResult struct {
210+
bz json.RawMessage
211+
err error
212+
}
213+
206214
type ModuleI interface {
207215
ExportGenesis(ctx context.Context) (json.RawMessage, error)
208216
}
209217

210-
genesisData := make(map[string]json.RawMessage)
211-
212-
// TODO: make async export genesis https://github.com/cosmos/cosmos-sdk/issues/21303
218+
channels := make(map[string]chan genesisResult)
213219
for _, moduleName := range modulesToExport {
214220
mod := m.modules[moduleName]
215221
var moduleI ModuleI
216-
217222
if module, hasGenesis := mod.(appmodulev2.HasGenesis); hasGenesis {
218223
moduleI = module.(ModuleI)
219224
} else if module, hasABCIGenesis := mod.(appmodulev2.HasABCIGenesis); hasABCIGenesis {
@@ -222,12 +227,29 @@ func (m *MM[T]) ExportGenesisForModules(
222227
continue
223228
}
224229

225-
res, err := moduleI.ExportGenesis(ctx)
226-
if err != nil {
227-
return nil, err
230+
channels[moduleName] = make(chan genesisResult)
231+
go func(moduleI ModuleI, ch chan genesisResult) {
232+
genesisCtx := services.NewGenesisContext(stateFactory())
233+
_, _ = genesisCtx.Run(ctx, func(ctx context.Context) error {
234+
jm, err := moduleI.ExportGenesis(ctx)
235+
if err != nil {
236+
ch <- genesisResult{nil, err}
237+
return err
238+
}
239+
ch <- genesisResult{jm, nil}
240+
return nil
241+
})
242+
}(moduleI, channels[moduleName])
243+
}
244+
245+
genesisData := make(map[string]json.RawMessage)
246+
for moduleName := range channels {
247+
res := <-channels[moduleName]
248+
if res.err != nil {
249+
return nil, fmt.Errorf("genesis export error in %s: %w", moduleName, res.err)
228250
}
229251

230-
genesisData[moduleName] = res
252+
genesisData[moduleName] = res.bz
231253
}
232254

233255
return genesisData, nil

0 commit comments

Comments
 (0)