From 00551e97789afe456aa281fc6e23c78c1c6d09dd Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Wed, 25 Oct 2023 12:09:03 +0200 Subject: [PATCH] refactor(network): call `app.Close()` on network cleanup (#18249) (cherry picked from commit 139a29e7e204d6848c5d4a5ed2472597aa939661) # Conflicts: # testutil/network/network.go # testutil/network/util.go --- testutil/network/network.go | 19 ++++++++++++++-- testutil/network/util.go | 45 +++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/testutil/network/network.go b/testutil/network/network.go index 0724a97f3b3a..b7db7d201d11 100644 --- a/testutil/network/network.go +++ b/testutil/network/network.go @@ -240,10 +240,20 @@ type ( ValAddress sdk.ValAddress RPCClient tmclient.Client +<<<<<<< HEAD tmNode *node.Node api *api.Server grpc *grpc.Server grpcWeb *http.Server +======= + app servertypes.Application + tmNode *node.Node + api *api.Server + grpc *grpc.Server + grpcWeb *http.Server + errGroup *errgroup.Group + cancelFn context.CancelFunc +>>>>>>> 139a29e7e (refactor(network): call `app.Close()` on network cleanup (#18249)) } // ValidatorI expose a validator's context and configuration @@ -581,8 +591,7 @@ func New(l Logger, baseDir string, cfg Config) (*Network, error) { l.Log("starting test network...") for idx, v := range network.Validators { - err := startInProcess(cfg, v) - if err != nil { + if err := startInProcess(cfg, v); err != nil { return nil, err } l.Log("started validator", idx) @@ -734,6 +743,12 @@ func (n *Network) Cleanup() { _ = v.grpcWeb.Close() } } + + if v.app != nil { + if err := v.app.Close(); err != nil { + n.Logger.Log("failed to stop validator ABCI application", "err", err) + } + } } // Give a brief pause for things to finish closing in other processes. Hopefully this helps with the address-in-use errors. diff --git a/testutil/network/util.go b/testutil/network/util.go index 24ad548f9418..d09063fdf7f4 100644 --- a/testutil/network/util.go +++ b/testutil/network/util.go @@ -15,6 +15,12 @@ import ( "github.com/cometbft/cometbft/types" tmtime "github.com/cometbft/cometbft/types/time" +<<<<<<< HEAD +======= + "cosmossdk.io/log" + + "github.com/cosmos/cosmos-sdk/server" +>>>>>>> 139a29e7e (refactor(network): call `app.Close()` on network cleanup (#18249)) "github.com/cosmos/cosmos-sdk/server/api" servergrpc "github.com/cosmos/cosmos-sdk/server/grpc" srvtypes "github.com/cosmos/cosmos-sdk/server/types" @@ -39,7 +45,17 @@ func startInProcess(cfg Config, val *Validator) error { } app := cfg.AppConstructor(*val) +<<<<<<< HEAD genDocProvider := node.DefaultGenesisDocProviderFunc(tmCfg) +======= + val.app = app + + appGenesisProvider := func() (*cmttypes.GenesisDoc, error) { + appGenesis, err := genutiltypes.AppGenesisFromFile(cmtCfg.GenesisFile()) + if err != nil { + return nil, err + } +>>>>>>> 139a29e7e (refactor(network): call `app.Close()` on network cleanup (#18249)) tmNode, err := node.NewNode( //resleak:notresource tmCfg, @@ -71,11 +87,40 @@ func startInProcess(cfg Config, val *Validator) error { app.RegisterTxService(val.ClientCtx) app.RegisterTendermintService(val.ClientCtx) +<<<<<<< HEAD app.RegisterNodeService(val.ClientCtx) } if val.APIAddress != "" { apiSrv := api.New(val.ClientCtx, logger.With("module", "api-server")) +======= + app.RegisterNodeService(val.ClientCtx, *val.AppConfig) + } + + ctx := context.Background() + ctx, val.cancelFn = context.WithCancel(ctx) + val.errGroup, ctx = errgroup.WithContext(ctx) + + grpcCfg := val.AppConfig.GRPC + + if grpcCfg.Enable { + grpcSrv, err := servergrpc.NewGRPCServer(val.ClientCtx, app, grpcCfg) + if err != nil { + return err + } + + // Start the gRPC server in a goroutine. Note, the provided ctx will ensure + // that the server is gracefully shut down. + val.errGroup.Go(func() error { + return servergrpc.StartGRPCServer(ctx, logger.With(log.ModuleKey, "grpc-server"), grpcCfg, grpcSrv) + }) + + val.grpc = grpcSrv + } + + if val.APIAddress != "" { + apiSrv := api.New(val.ClientCtx, logger.With(log.ModuleKey, "api-server"), val.grpc) +>>>>>>> 139a29e7e (refactor(network): call `app.Close()` on network cleanup (#18249)) app.RegisterAPIRoutes(apiSrv, val.AppConfig.API) errCh := make(chan error)