diff --git a/CHANGELOG.md b/CHANGELOG.md index b1302ef03984..c3609ae85c08 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -116,6 +116,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ * (x/staking) [#16068](https://github.com/cosmos/cosmos-sdk/pull/16068) Update simulation to allow non-EOA accounts to stake * (store) [#16067](https://github.com/cosmos/cosmos-sdk/pull/16067) Add local snapshots management commands. * (server) [#16142](https://github.com/cosmos/cosmos-sdk/pull/16142) Remove JSON Indentation from the GRPC to REST gateway's responses. (Saving bandwidth) +* (baseapp) [#16193](https://github.com/cosmos/cosmos-sdk/pull/16193) Add `Close` method to `BaseApp` for custom app to cleanup resource in graceful shutdown. ### State Machine Breaking diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index b89e88bd98dc..bffe143f6d54 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -1031,3 +1031,8 @@ func NoOpProcessProposal() sdk.ProcessProposalHandler { return abci.ResponseProcessProposal{Status: abci.ResponseProcessProposal_ACCEPT} } } + +// Close is called in start cmd to gracefully cleanup resources. +func (app *BaseApp) Close() error { + return nil +} diff --git a/server/start.go b/server/start.go index c8c3e51e9322..8a2ee0ccf08f 100644 --- a/server/start.go +++ b/server/start.go @@ -2,6 +2,7 @@ package server import ( "context" + "errors" "fmt" "io" "net" @@ -260,7 +261,7 @@ func startStandAlone(svrCtx *Context, appCreator types.AppCreator) error { // so we can gracefully stop the ABCI server. <-ctx.Done() svrCtx.Logger.Info("stopping the ABCI server...") - return svr.Stop() + return errors.Join(svr.Stop(), app.Close()) }) return g.Wait() @@ -366,6 +367,7 @@ func startInProcess(svrCtx *Context, clientCtx client.Context, appCreator types. defer func() { if tmNode != nil && tmNode.IsRunning() { _ = tmNode.Stop() + _ = app.Close() } if traceWriterCleanup != nil { diff --git a/server/types/app.go b/server/types/app.go index 1af0b0bf57ec..4b94665c7280 100644 --- a/server/types/app.go +++ b/server/types/app.go @@ -58,6 +58,9 @@ type ( // Return the snapshot manager SnapshotManager() *snapshots.Manager + + // Close is called in start cmd to gracefully cleanup resources. + Close() error } // AppCreator is a function that allows us to lazily initialize an