Skip to content

Commit a2e83e2

Browse files
mergify[bot]yihuangjulienrbrt
authored andcommitted
feat: add Close method for resource cleanup in graceful shutdown (backport cosmos#16193) (cosmos#16205)
Co-authored-by: yihuang <[email protected]> Co-authored-by: Julien Robert <[email protected]>
1 parent aee93cd commit a2e83e2

File tree

4 files changed

+11
-104
lines changed

4 files changed

+11
-104
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ Ref: https://keepachangelog.com/en/1.0.0/
4646
* (gov) [#15979](https://github.com/cosmos/cosmos-sdk/pull/15979) Improve gov error message when failing to convert v1 proposal to v1beta1.
4747
* (server) [#16061](https://github.com/cosmos/cosmos-sdk/pull/16061) add comet bootstrap command
4848
* (store) [#16067](https://github.com/cosmos/cosmos-sdk/pull/16067) Add local snapshots management commands.
49+
* (baseapp) [#16193](https://github.com/cosmos/cosmos-sdk/pull/16193) Add `Close` method to `BaseApp` for custom app to cleanup resource in graceful shutdown.
4950

5051
### Bug Fixes
5152

baseapp/baseapp.go

+1-101
Original file line numberDiff line numberDiff line change
@@ -1096,107 +1096,7 @@ func makeABCIData(msgResponses []*codectypes.Any) ([]byte, error) {
10961096
return proto.Marshal(&sdk.TxMsgData{MsgResponses: msgResponses})
10971097
}
10981098

1099-
func createEvents(cdc codec.Codec, events sdk.Events, msg sdk.Msg, reflectMsg protoreflect.Message) (sdk.Events, error) {
1100-
eventMsgName := sdk.MsgTypeURL(msg)
1101-
msgEvent := sdk.NewEvent(sdk.EventTypeMessage, sdk.NewAttribute(sdk.AttributeKeyAction, eventMsgName))
1102-
1103-
// we set the signer attribute as the sender
1104-
signers, err := cdc.GetReflectMsgSigners(reflectMsg)
1105-
if err != nil {
1106-
return nil, err
1107-
}
1108-
if len(signers) > 0 && signers[0] != nil {
1109-
addrStr, err := cdc.InterfaceRegistry().SigningContext().AddressCodec().BytesToString(signers[0])
1110-
if err != nil {
1111-
return nil, err
1112-
}
1113-
msgEvent = msgEvent.AppendAttributes(sdk.NewAttribute(sdk.AttributeKeySender, addrStr))
1114-
}
1115-
1116-
// verify that events have no module attribute set
1117-
if _, found := events.GetAttributes(sdk.AttributeKeyModule); !found {
1118-
if moduleName := sdk.GetModuleNameFromTypeURL(eventMsgName); moduleName != "" {
1119-
msgEvent = msgEvent.AppendAttributes(sdk.NewAttribute(sdk.AttributeKeyModule, moduleName))
1120-
}
1121-
}
1122-
1123-
return sdk.Events{msgEvent}.AppendEvents(events), nil
1124-
}
1125-
1126-
// PrepareProposalVerifyTx performs transaction verification when a proposer is
1127-
// creating a block proposal during PrepareProposal. Any state committed to the
1128-
// PrepareProposal state internally will be discarded. <nil, err> will be
1129-
// returned if the transaction cannot be encoded. <bz, nil> will be returned if
1130-
// the transaction is valid, otherwise <bz, err> will be returned.
1131-
func (app *BaseApp) PrepareProposalVerifyTx(tx sdk.Tx) ([]byte, error) {
1132-
bz, err := app.txEncoder(tx)
1133-
if err != nil {
1134-
return nil, err
1135-
}
1136-
1137-
_, _, _, err = app.runTx(execModePrepareProposal, bz)
1138-
if err != nil {
1139-
return nil, err
1140-
}
1141-
1142-
return bz, nil
1143-
}
1144-
1145-
// ProcessProposalVerifyTx performs transaction verification when receiving a
1146-
// block proposal during ProcessProposal. Any state committed to the
1147-
// ProcessProposal state internally will be discarded. <nil, err> will be
1148-
// returned if the transaction cannot be decoded. <Tx, nil> will be returned if
1149-
// the transaction is valid, otherwise <Tx, err> will be returned.
1150-
func (app *BaseApp) ProcessProposalVerifyTx(txBz []byte) (sdk.Tx, error) {
1151-
tx, err := app.txDecoder(txBz)
1152-
if err != nil {
1153-
return nil, err
1154-
}
1155-
1156-
_, _, _, err = app.runTx(execModeProcessProposal, txBz)
1157-
if err != nil {
1158-
return nil, err
1159-
}
1160-
1161-
return tx, nil
1162-
}
1163-
1164-
func (app *BaseApp) TxDecode(txBytes []byte) (sdk.Tx, error) {
1165-
return app.txDecoder(txBytes)
1166-
}
1167-
1168-
func (app *BaseApp) TxEncode(tx sdk.Tx) ([]byte, error) {
1169-
return app.txEncoder(tx)
1170-
}
1171-
11721099
// Close is called in start cmd to gracefully cleanup resources.
11731100
func (app *BaseApp) Close() error {
1174-
var errs []error
1175-
1176-
// Close app.db (opened by cosmos-sdk/server/start.go call to openDB)
1177-
if app.db != nil {
1178-
app.logger.Info("Closing application.db")
1179-
if err := app.db.Close(); err != nil {
1180-
errs = append(errs, err)
1181-
}
1182-
}
1183-
1184-
// Close app.snapshotManager
1185-
// - opened when app chains use cosmos-sdk/server/util.go/DefaultBaseappOptions (boilerplate)
1186-
// - which calls cosmos-sdk/server/util.go/GetSnapshotStore
1187-
// - which is passed to baseapp/options.go/SetSnapshot
1188-
// - to set app.snapshotManager = snapshots.NewManager
1189-
if app.snapshotManager != nil {
1190-
app.logger.Info("Closing snapshots/metadata.db")
1191-
if err := app.snapshotManager.Close(); err != nil {
1192-
errs = append(errs, err)
1193-
}
1194-
}
1195-
1196-
return errors.Join(errs...)
1197-
}
1198-
1199-
// GetBaseApp returns the pointer to itself.
1200-
func (app *BaseApp) GetBaseApp() *BaseApp {
1201-
return app
1101+
return nil
12021102
}

server/start.go

+6-3
Original file line numberDiff line numberDiff line change
@@ -262,9 +262,11 @@ func startStandAlone[T types.Application](svrCtx *Context, svrCfg serverconfig.C
262262
if err != nil {
263263
return err
264264
}
265-
// re-assign for making the client available below
266-
// do not use := to avoid shadowing clientCtx
267-
clientCtx = clientCtx.WithClient(rpcclient)
265+
266+
if err = app.Close(); err != nil {
267+
tmos.Exit(err.Error())
268+
}
269+
}()
268270

269271
// use the provided clientCtx to register the services
270272
app.RegisterTxService(clientCtx)
@@ -536,6 +538,7 @@ func startApp[T types.Application](svrCtx *Context, appCreator types.AppCreator[
536538
defer func() {
537539
if tmNode != nil && tmNode.IsRunning() {
538540
_ = tmNode.Stop()
541+
_ = app.Close()
539542
}
540543

541544
if apiSrv != nil {

server/types/app.go

+3
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ type (
5757

5858
// Return the snapshot manager
5959
SnapshotManager() *snapshots.Manager
60+
61+
// Close is called in start cmd to gracefully cleanup resources.
62+
Close() error
6063
}
6164

6265
// ApplicationQueryService defines an extension of the Application interface

0 commit comments

Comments
 (0)