diff --git a/internal/statesync/dispatcher.go b/internal/statesync/dispatcher.go index e7ad73148..baddcfc29 100644 --- a/internal/statesync/dispatcher.go +++ b/internal/statesync/dispatcher.go @@ -47,6 +47,7 @@ func (d *Dispatcher) LightBlock(ctx context.Context, height int64, peer types.No // dispatch the request to the peer callCh, err := d.dispatch(ctx, peer, height) if err != nil { + return nil, err } @@ -188,12 +189,13 @@ func (p *BlockProvider) LightBlock(ctx context.Context, height int64) (*types.Li switch err { case nil: if lb == nil { + return nil, provider.ErrLightBlockNotFound } case context.DeadlineExceeded, context.Canceled: return nil, err case errPeerAlreadyBusy: - return nil, provider.ErrLightBlockNotFound + return nil, err default: return nil, provider.ErrUnreliableProvider{Reason: err} } diff --git a/internal/statesync/reactor.go b/internal/statesync/reactor.go index 3a6599689..7319d22fa 100644 --- a/internal/statesync/reactor.go +++ b/internal/statesync/reactor.go @@ -279,7 +279,9 @@ func (r *Reactor) OnStart(ctx context.Context) error { "trustHeight", to.Height, "useP2P", r.cfg.UseP2P) if r.cfg.UseP2P { - if err := r.waitForEnoughPeers(ctx, 2); err != nil { + WAIT: + failed := 0 + if err := r.waitForEnoughPeers(ctx, 2+failed); err != nil { return err } @@ -291,8 +293,14 @@ func (r *Reactor) OnStart(ctx context.Context) error { stateProvider, err := NewP2PStateProvider(ctx, chainID, initialHeight, providers, to, paramsCh, r.logger.With("module", "stateprovider")) if err != nil { - return fmt.Errorf("failed to initialize P2P state provider: %w", err) + failed++ + if len(peers) == 2 && failed == 1 { + r.logger.Info("***** attempting to find more peers due to init error") + goto WAIT + } + return fmt.Errorf("failed to initialize P2P state provider: %w %d %s %s", err, r.peers.Len(), providers[0].ID(), providers[1].ID()) } + r.stateProvider = stateProvider return nil }