Merge pull request #24652 from karalabe/block-fetcher-timeouts

eth/fetcher: if peers never respond, drop them
pull/24657/head
Péter Szilágyi 3 years ago committed by GitHub
commit 111a1b73cf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 39
      eth/fetcher/block_fetcher.go

@ -477,10 +477,21 @@ func (f *BlockFetcher) loop() {
} }
defer req.Close() defer req.Close()
res := <-resCh timeout := time.NewTimer(2 * fetchTimeout) // 2x leeway before dropping the peer
res.Done <- nil defer timeout.Stop()
f.FilterHeaders(peer, *res.Res.(*eth.BlockHeadersPacket), time.Now().Add(res.Time)) select {
case res := <-resCh:
res.Done <- nil
f.FilterHeaders(peer, *res.Res.(*eth.BlockHeadersPacket), time.Now().Add(res.Time))
case <-timeout.C:
// The peer didn't respond in time. The request
// was already rescheduled at this point, we were
// waiting for a catchup. With an unresponsive
// peer however, it's a protocol violation.
f.dropPeer(peer)
}
}(hash) }(hash)
} }
}(peer) }(peer)
@ -523,11 +534,23 @@ func (f *BlockFetcher) loop() {
} }
defer req.Close() defer req.Close()
res := <-resCh timeout := time.NewTimer(2 * fetchTimeout) // 2x leeway before dropping the peer
res.Done <- nil defer timeout.Stop()
select {
case res := <-resCh:
res.Done <- nil
txs, uncles := res.Res.(*eth.BlockBodiesPacket).Unpack() txs, uncles := res.Res.(*eth.BlockBodiesPacket).Unpack()
f.FilterBodies(peer, txs, uncles, time.Now()) f.FilterBodies(peer, txs, uncles, time.Now())
case <-timeout.C:
// The peer didn't respond in time. The request
// was already rescheduled at this point, we were
// waiting for a catchup. With an unresponsive
// peer however, it's a protocol violation.
f.dropPeer(peer)
}
}(peer, hashes) }(peer, hashes)
} }
// Schedule the next fetch if blocks are still pending // Schedule the next fetch if blocks are still pending

Loading…
Cancel
Save