From 0d72e89ac4b719b212b0abaa3ac50109363670c2 Mon Sep 17 00:00:00 2001 From: William Banfield Date: Thu, 30 Sep 2021 13:40:21 -0400 Subject: [PATCH] recover on send on closed channel in statesync --- internal/statesync/reactor.go | 6 +++++- internal/statesync/syncer.go | 10 +++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/internal/statesync/reactor.go b/internal/statesync/reactor.go index 73b9e0af1..84cd69c7c 100644 --- a/internal/statesync/reactor.go +++ b/internal/statesync/reactor.go @@ -902,7 +902,11 @@ func (r *Reactor) processPeerUpdate(peerUpdate p2p.PeerUpdate) { case p2p.PeerStatusUp: newProvider := NewBlockProvider(peerUpdate.NodeID, r.chainID, r.dispatcher) r.providers[peerUpdate.NodeID] = newProvider - r.syncer.AddPeer(peerUpdate.NodeID) + err := r.syncer.AddPeer(peerUpdate.NodeID) + if err != nil { + r.Logger.Error("error adding peer to syncer", "error", err) + return + } if sp, ok := r.stateProvider.(*stateProviderP2P); ok { // we do this in a separate routine to not block whilst waiting for the light client to finish // whatever call it's currently executing diff --git a/internal/statesync/syncer.go b/internal/statesync/syncer.go index 68bec6880..33838c51c 100644 --- a/internal/statesync/syncer.go +++ b/internal/statesync/syncer.go @@ -141,7 +141,14 @@ func (s *syncer) AddSnapshot(peerID types.NodeID, snapshot *snapshot) (bool, err // AddPeer adds a peer to the pool. For now we just keep it simple and send a // single request to discover snapshots, later we may want to do retries and stuff. -func (s *syncer) AddPeer(peerID types.NodeID) { +func (s *syncer) AddPeer(peerID types.NodeID) error { + var err error + defer func() { + if r := recover(); r != nil { + err = fmt.Errorf("panic sending peer snapshot request: %v", r) + } + }() + s.logger.Debug("Requesting snapshots from peer", "peer", peerID) msg := p2p.Envelope{ @@ -153,6 +160,7 @@ func (s *syncer) AddPeer(peerID types.NodeID) { case <-s.closeCh: case s.snapshotCh <- msg: } + return err } // RemovePeer removes a peer from the pool.