fix: keep behavior from v0.47 in PrepareProposal panic recovery (backport #17930) (#18038)

Co-authored-by: Facundo Medica <14063057+facundomedica@users.noreply.github.com>
Co-authored-by: marbar3778 <marbar3778@yahoo.com>
Co-authored-by: Julien Robert <julien@rbrt.fr>
This commit is contained in:
mergify[bot] 2023-10-10 12:44:40 +00:00 committed by GitHub
parent 1f7ec34374
commit e5454c4dc7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 39 additions and 2 deletions

View File

@ -437,14 +437,14 @@ func (app *BaseApp) PrepareProposal(req *abci.RequestPrepareProposal) (resp *abc
"panic", err,
)
resp = &abci.ResponsePrepareProposal{}
resp = &abci.ResponsePrepareProposal{Txs: req.Txs}
}
}()
resp, err = app.prepareProposal(app.prepareProposalState.ctx, req)
if err != nil {
app.logger.Error("failed to prepare proposal", "height", req.Height, "time", req.Time, "err", err)
return &abci.ResponsePrepareProposal{}, nil
return &abci.ResponsePrepareProposal{Txs: req.Txs}, nil
}
return resp, nil

View File

@ -2275,3 +2275,40 @@ func TestBaseApp_VoteExtensions(t *testing.T) {
committedAvgPrice := suite.baseApp.NewContext(true).KVStore(capKey1).Get([]byte("avgPrice"))
require.Equal(t, avgPrice, committedAvgPrice)
}
func TestABCI_PrepareProposal_Panic(t *testing.T) {
prepareOpt := func(bapp *baseapp.BaseApp) {
bapp.SetPrepareProposal(func(ctx sdk.Context, req *abci.RequestPrepareProposal) (*abci.ResponsePrepareProposal, error) {
if len(req.Txs) == 3 {
panic("i don't like number 3, panic")
}
// return empty if no panic
return &abci.ResponsePrepareProposal{}, nil
})
}
suite := NewBaseAppSuite(t, prepareOpt)
_, err := suite.baseApp.InitChain(&abci.RequestInitChain{
InitialHeight: 1,
ConsensusParams: &cmtproto.ConsensusParams{},
})
require.NoError(t, err)
txs := [][]byte{{1}, {2}}
reqPrepareProposal := abci.RequestPrepareProposal{
MaxTxBytes: 1000,
Height: 1, // this value can't be 0
Txs: txs,
}
resPrepareProposal, err := suite.baseApp.PrepareProposal(&reqPrepareProposal)
require.NoError(t, err)
require.Equal(t, 0, len(resPrepareProposal.Txs))
// make it panic, and check if it returns 3 txs (because of panic recovery)
txs = [][]byte{{1}, {2}, {3}}
reqPrepareProposal.Txs = txs
resPrepareProposal, err = suite.baseApp.PrepareProposal(&reqPrepareProposal)
require.NoError(t, err)
require.Equal(t, 3, len(resPrepareProposal.Txs))
}