@@ -21,8 +21,10 @@ import (
21
21
"cosmossdk.io/core/appmodule"
22
22
appmodulev2 "cosmossdk.io/core/appmodule/v2"
23
23
"cosmossdk.io/core/registry"
24
+ "cosmossdk.io/core/store"
24
25
"cosmossdk.io/core/transaction"
25
26
"cosmossdk.io/log"
27
+ "cosmossdk.io/runtime/v2/services"
26
28
"cosmossdk.io/server/v2/stf"
27
29
)
28
30
@@ -193,6 +195,7 @@ func (m *MM[T]) InitGenesisJSON(
193
195
// ExportGenesisForModules performs export genesis functionality for modules
194
196
func (m * MM [T ]) ExportGenesisForModules (
195
197
ctx context.Context ,
198
+ stateFactory func () store.WriterMap ,
196
199
modulesToExport ... string ,
197
200
) (map [string ]json.RawMessage , error ) {
198
201
if len (modulesToExport ) == 0 {
@@ -203,17 +206,19 @@ func (m *MM[T]) ExportGenesisForModules(
203
206
return nil , err
204
207
}
205
208
209
+ type genesisResult struct {
210
+ bz json.RawMessage
211
+ err error
212
+ }
213
+
206
214
type ModuleI interface {
207
215
ExportGenesis (ctx context.Context ) (json.RawMessage , error )
208
216
}
209
217
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 )
213
219
for _ , moduleName := range modulesToExport {
214
220
mod := m .modules [moduleName ]
215
221
var moduleI ModuleI
216
-
217
222
if module , hasGenesis := mod .(appmodulev2.HasGenesis ); hasGenesis {
218
223
moduleI = module .(ModuleI )
219
224
} else if module , hasABCIGenesis := mod .(appmodulev2.HasABCIGenesis ); hasABCIGenesis {
@@ -222,12 +227,29 @@ func (m *MM[T]) ExportGenesisForModules(
222
227
continue
223
228
}
224
229
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 )
228
250
}
229
251
230
- genesisData [moduleName ] = res
252
+ genesisData [moduleName ] = res . bz
231
253
}
232
254
233
255
return genesisData , nil
0 commit comments