diff --git a/server/indexer_service.go b/server/indexer_service.go index 88e8c56240..bfb729c158 100644 --- a/server/indexer_service.go +++ b/server/indexer_service.go @@ -23,6 +23,7 @@ import ( "github.com/cenkalti/backoff/v4" "github.com/cometbft/cometbft/libs/service" rpcclient "github.com/cometbft/cometbft/rpc/client" + coretypes "github.com/cometbft/cometbft/rpc/core/types" "github.com/cometbft/cometbft/types" ethermint "github.com/evmos/ethermint/types" @@ -111,9 +112,18 @@ func (eis *EVMIndexerService) OnStart() error { if lastBlock == -1 { lastBlock = latestBlock } + // blockErr indicates an error fetching an expected block or its results + var blockErr error for { - if latestBlock <= lastBlock { - // nothing to index. wait for signal of new block + var block *coretypes.ResultBlock + var blockResult *coretypes.ResultBlockResults + if latestBlock <= lastBlock || blockErr != nil { + // two cases: + // 1. nothing to index (indexer is caught up). wait for signal of new block. + // 2. previous attempt to index errored (failed to fetch the Block or BlockResults). + // in this case, wait before retrying the data fetching, rather than infinite looping + // a failing fetch. this can occur due to drive latency between the block existing and its + // block_results getting saved. select { case <-newBlockSignal: case <-time.After(NewBlockWaitTimeout): @@ -121,14 +131,14 @@ func (eis *EVMIndexerService) OnStart() error { continue } for i := lastBlock + 1; i <= latestBlock; i++ { - block, err := eis.client.Block(ctx, &i) - if err != nil { - eis.Logger.Error("failed to fetch block", "height", i, "err", err) + block, blockErr = eis.client.Block(ctx, &i) + if blockErr != nil { + eis.Logger.Error("failed to fetch block", "height", i, "err", blockErr) break } - blockResult, err := eis.client.BlockResults(ctx, &i) - if err != nil { - eis.Logger.Error("failed to fetch block result", "height", i, "err", err) + blockResult, blockErr = eis.client.BlockResults(ctx, &i) + if blockErr != nil { + eis.Logger.Error("failed to fetch block result", "height", i, "err", blockErr) break } if err := eis.txIdxr.IndexBlock(block.Block, blockResult.TxsResults); err != nil {