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

This commit is contained in:
Facundo Medica 2023-10-10 14:01:29 +03:00 committed by GitHub
parent 7d7d4907f4
commit 223e179f2b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 39 additions and 2 deletions

View File

@ -453,14 +453,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

@ -2296,6 +2296,43 @@ func TestBaseApp_VoteExtensions(t *testing.T) {
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))
}
func TestOptimisticExecution(t *testing.T) {
suite := NewBaseAppSuite(t, baseapp.SetOptimisticExecution())