diff --git a/action/protocol/staking/protocol.go b/action/protocol/staking/protocol.go index 53822f8266..edf46b77aa 100644 --- a/action/protocol/staking/protocol.go +++ b/action/protocol/staking/protocol.go @@ -265,14 +265,8 @@ func (p *Protocol) Start(ctx context.Context, sr protocol.StateReader) (protocol } } c.contractsStake = &contractStakeView{} - if p.skipContractStakingView(height) { - return c, nil - } - - wg := sync.WaitGroup{} - errChan := make(chan error, 3) - checker := blockdao.GetChecker(ctx) checkIndex := func(indexer ContractStakingIndexer) error { + checker := blockdao.GetChecker(ctx) if checker == nil { return nil } @@ -301,38 +295,46 @@ func (p *Protocol) Start(ctx context.Context, sr protocol.StateReader) (protocol } return checker.CheckIndexer(ctx, indexer, height, func(h uint64) { if h%5000 == 0 || h == height { - log.L().Info("Checking contract staking indexer", zap.Uint64("height", h)) + log.L().Info("Checking contract staking indexer", zap.Uint64("height", h), zap.String("contract", indexer.ContractAddress().String())) } }) } - buildView := func(indexer ContractStakingIndexer, callback func(ContractStakeView)) { - if indexer == nil { - return + // List of all indexers to process + indexers := []struct { + indexer ContractStakingIndexer + setter func(ContractStakeView) + }{ + {p.contractStakingIndexer, func(v ContractStakeView) { c.contractsStake.v1 = v }}, + {p.contractStakingIndexerV2, func(v ContractStakeView) { c.contractsStake.v2 = v }}, + {p.contractStakingIndexerV3, func(v ContractStakeView) { c.contractsStake.v3 = v }}, + } + // Process all indexers in parallel + wg := sync.WaitGroup{} + errChan := make(chan error, len(indexers)) + skipView := p.skipContractStakingView(height) + for _, idx := range indexers { + if idx.indexer == nil { + continue } wg.Add(1) - go func() { + go func(indexer ContractStakingIndexer, setter func(ContractStakeView)) { defer wg.Done() + // First, checking the indexer if err := checkIndex(indexer); err != nil { - errChan <- errors.Wrap(err, "failed to check contract staking indexer") + errChan <- errors.Wrapf(err, "failed to check contract staking indexer %s", indexer.ContractAddress()) return } - view, err := NewContractStakeViewBuilder(indexer, p.blockStore).Build(ctx, sr, height) - if err != nil { - errChan <- errors.Wrapf(err, "failed to create stake view for contract %s", indexer.ContractAddress()) - return + // If not skipping view creation, build the view + if !skipView { + view, err := NewContractStakeViewBuilder(indexer, p.blockStore).Build(ctx, sr, height) + if err != nil { + errChan <- errors.Wrapf(err, "failed to create stake view for contract %s", indexer.ContractAddress()) + return + } + setter(view) } - callback(view) - }() - } - buildView(p.contractStakingIndexer, func(view ContractStakeView) { - c.contractsStake.v1 = view - }) - buildView(p.contractStakingIndexerV2, func(view ContractStakeView) { - c.contractsStake.v2 = view - }) - buildView(p.contractStakingIndexerV3, func(view ContractStakeView) { - c.contractsStake.v3 = view - }) + }(idx.indexer, idx.setter) + } wg.Wait() close(errChan) for err := range errChan {