From dca074ca0cf53d8fdbdb820fb97d6461323a340b Mon Sep 17 00:00:00 2001 From: invis-bitfly <162128378+invis-bitfly@users.noreply.github.com> Date: Tue, 21 May 2024 14:50:24 +0200 Subject: [PATCH] exporter: fix rare deadlock in el payload exporter (#318) --- .../modules/execution_payloads_exporter.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/backend/pkg/exporter/modules/execution_payloads_exporter.go b/backend/pkg/exporter/modules/execution_payloads_exporter.go index 9b9a18898..d016e1eab 100644 --- a/backend/pkg/exporter/modules/execution_payloads_exporter.go +++ b/backend/pkg/exporter/modules/execution_payloads_exporter.go @@ -66,7 +66,7 @@ func (d *executionPayloadsExporter) OnFinalizedCheckpoint(event *constypes.Stand return err } - log.Debugf("updating execution payloads cached view took %v", time.Since(start)) + log.Infof("updating execution payloads cached view took %v", time.Since(start)) return nil } @@ -139,22 +139,22 @@ func (d *executionPayloadsExporter) maintainTable() (err error) { } resData := make([]Result, 0, maxBlock-minBlock+1) - ctx, finish := context.WithCancel(context.Background()) - defer finish() + ctx, abortProcessing := context.WithCancel(context.Background()) + defer abortProcessing() // to kill the errgroup if something goes wrong group, _ := errgroup.WithContext(ctx) // coroutine to process the blocks group.Go(func() error { var block *types.Eth1BlockIndexed - for i := minBlock; i <= maxBlock; i++ { + for { select { case <-ctx.Done(): return ctx.Err() case b, ok := <-blockChan: - block = b if !ok { return nil } + block = b } // read txn reward raw := block.GetTxReward() @@ -175,16 +175,16 @@ func (d *executionPayloadsExporter) maintainTable() (err error) { } resData = append(resData, Result{BlockHash: hash, FeeRecipientReward: dec}) } - return nil }) err = db.BigtableClient.StreamBlocksIndexedDescending(blockChan, maxBlock, minBlock) if err != nil { - finish() + abortProcessing() return fmt.Errorf("error streaming blocks: %w", err) } + close(blockChan) // possible deadlock if not closed err = group.Wait() if err != nil {