|
5 | 5 | "errors"
|
6 | 6 | "fmt"
|
7 | 7 | "math/big"
|
| 8 | + "strings" |
8 | 9 | "sync"
|
9 | 10 | "time"
|
10 | 11 |
|
@@ -323,27 +324,51 @@ func (ms *monitorStatus) processBatchesConcurrently(ctx context.Context, rpc *et
|
323 | 324 | }
|
324 | 325 | subBatch := blms[i:end]
|
325 | 326 |
|
326 |
| - b := backoff.NewExponentialBackOff() |
327 |
| - b.MaxElapsedTime = 3 * time.Minute |
328 |
| - retryable := func() error { |
329 |
| - return rpc.BatchCallContext(ctx, subBatch) |
330 |
| - } |
331 |
| - if err := backoff.Retry(retryable, b); err != nil { |
332 |
| - log.Error().Err(err).Msg("unable to retry") |
333 |
| - errorsMutex.Lock() |
334 |
| - errs = append(errs, err) |
335 |
| - errorsMutex.Unlock() |
| 327 | + doneCh := make(chan error, 1) |
| 328 | + |
| 329 | + go func() { |
| 330 | + b := backoff.NewExponentialBackOff() |
| 331 | + b.MaxElapsedTime = 3 * time.Minute |
| 332 | + retryable := func() error { |
| 333 | + select { |
| 334 | + case <-ctx.Done(): |
| 335 | + return ctx.Err() |
| 336 | + default: |
| 337 | + err := rpc.BatchCallContext(ctx, subBatch) |
| 338 | + if err != nil { |
| 339 | + log.Error().Err(err).Msg("BatchCallContext error - retry loop") |
| 340 | + if strings.Contains(err.Error(), "limit") { |
| 341 | + return backoff.Permanent(err) |
| 342 | + } |
| 343 | + } |
| 344 | + return err |
| 345 | + } |
| 346 | + } |
| 347 | + err := backoff.Retry(retryable, b) |
| 348 | + doneCh <- err |
| 349 | + }() |
| 350 | + |
| 351 | + select { |
| 352 | + case <-ctx.Done(): |
336 | 353 | return
|
337 |
| - } |
| 354 | + case err := <-doneCh: |
| 355 | + if err != nil { |
| 356 | + log.Error().Err(err).Msg("unable to retry") |
| 357 | + errorsMutex.Lock() |
| 358 | + errs = append(errs, err) |
| 359 | + errorsMutex.Unlock() |
| 360 | + return |
| 361 | + } |
338 | 362 |
|
339 |
| - for _, elem := range subBatch { |
340 |
| - if elem.Error != nil { |
341 |
| - log.Error().Str("Method", elem.Method).Interface("Args", elem.Args).Err(elem.Error).Msg("Failed batch element") |
342 |
| - } else { |
343 |
| - pb := rpctypes.NewPolyBlock(elem.Result.(*rpctypes.RawBlockResponse)) |
344 |
| - ms.BlocksLock.Lock() |
345 |
| - ms.BlockCache.Add(pb.Number().String(), pb) |
346 |
| - ms.BlocksLock.Unlock() |
| 363 | + for _, elem := range subBatch { |
| 364 | + if elem.Error != nil { |
| 365 | + log.Error().Str("Method", elem.Method).Interface("Args", elem.Args).Err(elem.Error).Msg("Failed batch element") |
| 366 | + } else { |
| 367 | + pb := rpctypes.NewPolyBlock(elem.Result.(*rpctypes.RawBlockResponse)) |
| 368 | + ms.BlocksLock.Lock() |
| 369 | + ms.BlockCache.Add(pb.Number().String(), pb) |
| 370 | + ms.BlocksLock.Unlock() |
| 371 | + } |
347 | 372 | }
|
348 | 373 | }
|
349 | 374 |
|
@@ -434,12 +459,10 @@ func renderMonitorUI(ctx context.Context, ec *ethclient.Client, ms *monitorStatu
|
434 | 459 | bottomBlockNumber.SetInt64(0)
|
435 | 460 | }
|
436 | 461 |
|
437 |
| - // if ms.LowerBlock == nil || ms.LowerBlock.Cmp(bottomBlockNumber) > 0 { |
438 | 462 | err := ms.getBlockRange(ctx, ms.TopDisplayedBlock, rpc)
|
439 | 463 | if err != nil {
|
440 | 464 | log.Error().Err(err).Msg("There was an issue fetching the block range")
|
441 | 465 | }
|
442 |
| - // } |
443 | 466 | }
|
444 | 467 | toBlockNumber := ms.TopDisplayedBlock
|
445 | 468 | fromBlockNumber := new(big.Int).Sub(toBlockNumber, big.NewInt(int64(windowSize-1)))
|
|
0 commit comments