@@ -321,13 +321,28 @@ func (d *Downloader) UnregisterPeer(id string) error {
321
321
// adding various sanity checks as well as wrapping it with various log entries.
322
322
func (d * Downloader ) Synchronise (id string , head common.Hash , td * big.Int , mode SyncMode ) error {
323
323
err := d .synchronise (id , head , td , mode )
324
+
324
325
switch err {
325
- case nil :
326
- case errBusy , errCanceled :
326
+ case nil , errBusy , errCanceled :
327
+ return err
328
+ }
327
329
330
+ if errors .Is (err , errInvalidChain ) {
331
+ log .Warn ("Synchronisation failed, dropping peer" , "peer" , id , "err" , err )
332
+ if d .dropPeer == nil {
333
+ // The dropPeer method is nil when `--copydb` is used for a local copy.
334
+ // Timeouts can occur if e.g. compaction hits at the wrong time, and can be ignored
335
+ log .Warn ("Downloader wants to drop peer, but peerdrop-function is not set" , "peer" , id )
336
+ } else {
337
+ d .dropPeer (id )
338
+ }
339
+ return err
340
+ }
341
+
342
+ switch err {
328
343
case errTimeout , errBadPeer , errStallingPeer , errUnsyncedPeer ,
329
344
errEmptyHeaderSet , errPeersUnavailable , errTooOld ,
330
- errInvalidAncestor , errInvalidChain :
345
+ errInvalidAncestor :
331
346
log .Warn ("Synchronisation failed, dropping peer" , "peer" , id , "err" , err )
332
347
if d .dropPeer == nil {
333
348
// The dropPeer method is nil when `--copydb` is used for a local copy.
@@ -774,7 +789,7 @@ func (d *Downloader) findAncestor(p *peerConnection, remoteHeader *types.Header)
774
789
expectNumber := from + int64 (i )* int64 (skip + 1 )
775
790
if number := header .Number .Int64 (); number != expectNumber {
776
791
p .log .Warn ("Head headers broke chain ordering" , "index" , i , "requested" , expectNumber , "received" , number )
777
- return 0 , errInvalidChain
792
+ return 0 , fmt . Errorf ( "%w: %v" , errInvalidChain , errors . New ( "head headers broke chain ordering" ))
778
793
}
779
794
}
780
795
// Check if a common ancestor was found
@@ -988,7 +1003,7 @@ func (d *Downloader) fetchHeaders(p *peerConnection, from uint64, pivot uint64)
988
1003
filled , proced , err := d .fillHeaderSkeleton (from , headers )
989
1004
if err != nil {
990
1005
p .log .Debug ("Skeleton chain invalid" , "err" , err )
991
- return errInvalidChain
1006
+ return fmt . Errorf ( "%w: %v" , errInvalidChain , err )
992
1007
}
993
1008
headers = filled [proced :]
994
1009
from += uint64 (proced )
@@ -1207,13 +1222,13 @@ func (d *Downloader) fetchParts(deliveryCh chan dataPack, deliver func(dataPack)
1207
1222
if peer := d .peers .Peer (packet .PeerId ()); peer != nil {
1208
1223
// Deliver the received chunk of data and check chain validity
1209
1224
accepted , err := deliver (packet )
1210
- if err == errInvalidChain {
1225
+ if errors . Is ( err , errInvalidChain ) {
1211
1226
return err
1212
1227
}
1213
1228
// Unless a peer delivered something completely else than requested (usually
1214
1229
// caused by a timed out request which came through in the end), set it to
1215
1230
// idle. If the delivery's stale, the peer should have already been idled.
1216
- if err != errStaleDelivery {
1231
+ if ! errors . Is ( err , errStaleDelivery ) {
1217
1232
setIdle (peer , accepted )
1218
1233
}
1219
1234
// Issue a log to the user to see what's going on
@@ -1473,7 +1488,7 @@ func (d *Downloader) processHeaders(origin uint64, pivot uint64, td *big.Int) er
1473
1488
rollback = append (rollback , chunk [:n ]... )
1474
1489
}
1475
1490
log .Debug ("Invalid header encountered" , "number" , chunk [n ].Number , "hash" , chunk [n ].Hash (), "err" , err )
1476
- return errInvalidChain
1491
+ return fmt . Errorf ( "%w: %v" , errInvalidChain , err )
1477
1492
}
1478
1493
// All verifications passed, store newly found uncertain headers
1479
1494
rollback = append (rollback , unknown ... )
@@ -1565,7 +1580,7 @@ func (d *Downloader) importBlockResults(results []*fetchResult) error {
1565
1580
// of the blocks delivered from the downloader, and the indexing will be off.
1566
1581
log .Debug ("Downloaded item processing failed on sidechain import" , "index" , index , "err" , err )
1567
1582
}
1568
- return errInvalidChain
1583
+ return fmt . Errorf ( "%w: %v" , errInvalidChain , err )
1569
1584
}
1570
1585
return nil
1571
1586
}
@@ -1706,7 +1721,7 @@ func (d *Downloader) commitFastSyncData(results []*fetchResult, stateSync *state
1706
1721
}
1707
1722
if index , err := d .blockchain .InsertReceiptChain (blocks , receipts , d .ancientLimit ); err != nil {
1708
1723
log .Debug ("Downloaded item processing failed" , "number" , results [index ].Header .Number , "hash" , results [index ].Header .Hash (), "err" , err )
1709
- return errInvalidChain
1724
+ return fmt . Errorf ( "%w: %v" , errInvalidChain , err )
1710
1725
}
1711
1726
return nil
1712
1727
}
0 commit comments