From 6d78170ebbedcced87f6b77cf6d3fc723eafa6d5 Mon Sep 17 00:00:00 2001 From: mmsqe Date: Mon, 6 Oct 2025 09:10:57 +0800 Subject: [PATCH 1/2] fix: indexer service can't quit by signal --- CHANGELOG.md | 1 + server/start.go | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 58e520781..4fbb46311 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ - [\#645](https://github.com/cosmos/evm/pull/645) Align precise bank keeper for correct decimal conversion in evmd. - [\#656](https://github.com/cosmos/evm/pull/656) Fix race condition in concurrent usage of mempool StateAt and NotifyNewBlock methods. - [\#658](https://github.com/cosmos/evm/pull/658) Fix race condition between legacypool's RemoveTx and runReorg. +- [\#687](https://github.com/cosmos/evm/pull/687) Avoid blocking node shutdown when evm indexer is enabled, log startup failures instead of using errgroup. ### IMPROVEMENTS diff --git a/server/start.go b/server/start.go index 1a08fcb0d..ea8940ce4 100644 --- a/server/start.go +++ b/server/start.go @@ -480,9 +480,11 @@ func startInProcess(svrCtx *server.Context, clientCtx client.Context, opts Start indexerService := NewEVMIndexerService(idxer, clientCtx.Client.(rpcclient.Client)) indexerService.SetLogger(servercmtlog.CometLoggerWrapper{Logger: idxLogger}) - g.Go(func() error { - return indexerService.Start() - }) + go func() { + if err := indexerService.Start(); err != nil { + logger.Error("failed to start evm indexer service", "error", err.Error()) + } + }() } if config.API.Enable || config.JSONRPC.Enable { From e7398abae930345fb33573ebddf51e42ee72c2ad Mon Sep 17 00:00:00 2001 From: mmsqe Date: Mon, 6 Oct 2025 11:33:12 +0800 Subject: [PATCH 2/2] cleanup --- server/start.go | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/server/start.go b/server/start.go index ea8940ce4..9c0d17763 100644 --- a/server/start.go +++ b/server/start.go @@ -480,11 +480,28 @@ func startInProcess(svrCtx *server.Context, clientCtx client.Context, opts Start indexerService := NewEVMIndexerService(idxer, clientCtx.Client.(rpcclient.Client)) indexerService.SetLogger(servercmtlog.CometLoggerWrapper{Logger: idxLogger}) - go func() { - if err := indexerService.Start(); err != nil { - logger.Error("failed to start evm indexer service", "error", err.Error()) + g.Go(func() error { + errCh := make(chan error, 1) + go func() { + if err := indexerService.Start(); err != nil { + errCh <- err + } + }() + + select { + case <-ctx.Done(): + logger.Info("stopping evm indexer service due to context cancellation") + if err := indexerService.Stop(); err != nil { + logger.Error("failed to stop evm indexer service", "error", err.Error()) + } + return ctx.Err() + case err := <-errCh: + if err != nil { + logger.Error("evm indexer service failed", "error", err.Error()) + } + return err } - }() + }) } if config.API.Enable || config.JSONRPC.Enable {