@@ -353,7 +353,8 @@ type App struct {
353353
354354 configurator module.Configurator
355355
356- optimisticProcessingInfo * OptimisticProcessingInfo
356+ optimisticProcessingInfo OptimisticProcessingInfo
357+ optimisticProcessingInfoMutex sync.RWMutex
357358
358359 // batchVerifier *ante.SR25519BatchVerifier
359360 txDecoder sdk.TxDecoder
@@ -1071,10 +1072,10 @@ func (app *App) SetStoreUpgradeHandlers() {
10711072func (app * App ) Name () string { return app .BaseApp .Name () }
10721073
10731074// GetBaseApp returns the base app of the application
1074- func (app App ) GetBaseApp () * baseapp.BaseApp { return app .BaseApp }
1075+ func (app * App ) GetBaseApp () * baseapp.BaseApp { return app .BaseApp }
10751076
10761077// GetStateStore returns the state store of the application
1077- func (app App ) GetStateStore () seidb.StateStore { return app .stateStore }
1078+ func (app * App ) GetStateStore () seidb.StateStore { return app .stateStore }
10781079
10791080// BeginBlocker application updates every begin block
10801081func (app * App ) BeginBlocker (ctx sdk.Context , req abci.RequestBeginBlock ) abci.ResponseBeginBlock {
@@ -1120,12 +1121,16 @@ func (app *App) PrepareProposalHandler(_ sdk.Context, req *abci.RequestPreparePr
11201121 }, nil
11211122}
11221123
1123- func (app * App ) GetOptimisticProcessingInfo () * OptimisticProcessingInfo {
1124+ func (app * App ) GetOptimisticProcessingInfo () OptimisticProcessingInfo {
1125+ app .optimisticProcessingInfoMutex .RLock ()
1126+ defer app .optimisticProcessingInfoMutex .RUnlock ()
11241127 return app .optimisticProcessingInfo
11251128}
11261129
11271130func (app * App ) ClearOptimisticProcessingInfo () {
1128- app .optimisticProcessingInfo = nil
1131+ app .optimisticProcessingInfoMutex .Lock ()
1132+ defer app .optimisticProcessingInfoMutex .Unlock ()
1133+ app .optimisticProcessingInfo = OptimisticProcessingInfo {}
11291134}
11301135
11311136func (app * App ) ProcessProposalHandler (ctx sdk.Context , req * abci.RequestProcessProposal ) (* abci.ResponseProcessProposal , error ) {
@@ -1138,31 +1143,41 @@ func (app *App) ProcessProposalHandler(ctx sdk.Context, req *abci.RequestProcess
11381143 Status : abci .ResponseProcessProposal_REJECT ,
11391144 }, nil
11401145 }
1141- if app .optimisticProcessingInfo == nil {
1146+ if app .GetOptimisticProcessingInfo (). Completion == nil {
11421147 completionSignal := make (chan struct {}, 1 )
1143- optimisticProcessingInfo := & OptimisticProcessingInfo {
1148+ optimisticProcessingInfo := OptimisticProcessingInfo {
11441149 Height : req .Height ,
11451150 Hash : req .Hash ,
11461151 Completion : completionSignal ,
11471152 }
1153+ app .optimisticProcessingInfoMutex .Lock ()
11481154 app .optimisticProcessingInfo = optimisticProcessingInfo
1155+ app .optimisticProcessingInfoMutex .Unlock ()
11491156
11501157 plan , found := app .UpgradeKeeper .GetUpgradePlan (ctx )
11511158 if found && plan .ShouldExecute (ctx ) {
11521159 app .Logger ().Info (fmt .Sprintf ("Potential upgrade planned for height=%d skipping optimistic processing" , plan .Height ))
1160+ app .optimisticProcessingInfoMutex .Lock ()
11531161 app .optimisticProcessingInfo .Aborted = true
1154- app .optimisticProcessingInfo .Completion <- struct {}{}
1162+ completion := app .optimisticProcessingInfo .Completion
1163+ app .optimisticProcessingInfoMutex .Unlock ()
1164+ completion <- struct {}{}
11551165 } else {
11561166 go func () {
11571167 events , txResults , endBlockResp , _ := app .ProcessBlock (ctx , req .Txs , req , req .ProposedLastCommit , false )
1158- optimisticProcessingInfo .Events = events
1159- optimisticProcessingInfo .TxRes = txResults
1160- optimisticProcessingInfo .EndBlockResp = endBlockResp
1161- optimisticProcessingInfo .Completion <- struct {}{}
1168+ app .optimisticProcessingInfoMutex .Lock ()
1169+ app .optimisticProcessingInfo .Events = events
1170+ app .optimisticProcessingInfo .TxRes = txResults
1171+ app .optimisticProcessingInfo .EndBlockResp = endBlockResp
1172+ completion := app .optimisticProcessingInfo .Completion
1173+ app .optimisticProcessingInfoMutex .Unlock ()
1174+ completion <- struct {}{}
11621175 }()
11631176 }
1164- } else if ! bytes .Equal (app .optimisticProcessingInfo .Hash , req .Hash ) {
1177+ } else if ! bytes .Equal (app .GetOptimisticProcessingInfo ().Hash , req .Hash ) {
1178+ app .optimisticProcessingInfoMutex .Lock ()
11651179 app .optimisticProcessingInfo .Aborted = true
1180+ app .optimisticProcessingInfoMutex .Unlock ()
11661181 }
11671182 return & abci.ResponseProcessProposal {
11681183 Status : abci .ResponseProcessProposal_ACCEPT ,
@@ -1176,9 +1191,25 @@ func (app *App) FinalizeBlocker(ctx sdk.Context, req *abci.RequestFinalizeBlock)
11761191 duration := time .Since (startTime )
11771192 ctx .Logger ().Info (fmt .Sprintf ("FinalizeBlock took %dms" , duration / time .Millisecond ))
11781193 }()
1179- if app .optimisticProcessingInfo != nil {
1180- <- app .optimisticProcessingInfo .Completion
1181- if ! app .optimisticProcessingInfo .Aborted && bytes .Equal (app .optimisticProcessingInfo .Hash , req .Hash ) {
1194+
1195+ // Get all optimistic processing info atomically
1196+ app .optimisticProcessingInfoMutex .RLock ()
1197+ completion := app .optimisticProcessingInfo .Completion
1198+ app .optimisticProcessingInfoMutex .RUnlock ()
1199+
1200+ if completion != nil {
1201+ <- completion
1202+
1203+ // Get the final state atomically after completion
1204+ app .optimisticProcessingInfoMutex .RLock ()
1205+ aborted := app .optimisticProcessingInfo .Aborted
1206+ finalHash := app .optimisticProcessingInfo .Hash
1207+ events := app .optimisticProcessingInfo .Events
1208+ txRes := app .optimisticProcessingInfo .TxRes
1209+ endBlockResp := app .optimisticProcessingInfo .EndBlockResp
1210+ app .optimisticProcessingInfoMutex .RUnlock ()
1211+
1212+ if ! aborted && bytes .Equal (finalHash , req .Hash ) {
11821213 metrics .IncrementOptimisticProcessingCounter (true )
11831214 app .SetProcessProposalStateToCommit ()
11841215 if app .EvmKeeper .EthReplayConfig .Enabled || app .EvmKeeper .EthBlockTestConfig .Enabled {
@@ -1187,7 +1218,7 @@ func (app *App) FinalizeBlocker(ctx sdk.Context, req *abci.RequestFinalizeBlock)
11871218 cms := app .WriteState ()
11881219 app .LightInvarianceChecks (cms , app .lightInvarianceConfig )
11891220 appHash := app .GetWorkingHash ()
1190- resp := app .getFinalizeBlockResponse (appHash , app . optimisticProcessingInfo . Events , app . optimisticProcessingInfo . TxRes , app . optimisticProcessingInfo . EndBlockResp )
1221+ resp := app .getFinalizeBlockResponse (appHash , events , txRes , endBlockResp )
11911222 return & resp , nil
11921223 }
11931224 }
0 commit comments