@@ -21,6 +21,7 @@ import (
21
21
"time"
22
22
23
23
"github.com/ethereum/go-ethereum/common"
24
+ "github.com/ethereum/go-ethereum/core/types"
24
25
"github.com/ethereum/go-ethereum/log"
25
26
)
26
27
@@ -48,34 +49,39 @@ func (d *Downloader) BeaconDevSync(mode SyncMode, hash common.Hash, stop chan st
48
49
return errors .New ("stop requested" )
49
50
default :
50
51
}
51
- // Pick a random peer to sync from and keep retrying if none are yet
52
- // available due to fresh startup
53
- d .peers .lock .RLock ()
54
- var peer * peerConnection
55
- for _ , peer = range d .peers .peers {
56
- break
52
+ header , err := d .GetHeader (hash )
53
+ if err != nil {
54
+ time .Sleep (time .Second )
55
+ continue
57
56
}
58
- d .peers .lock .RUnlock ()
57
+ return d .BeaconSync (mode , header , header )
58
+ }
59
+ }
60
+
61
+ // GetHeader tries to retrieve the header with a given hash from a random peer.
62
+ func (d * Downloader ) GetHeader (hash common.Hash ) (* types.Header , error ) {
63
+ // Pick a random peer to sync from and keep retrying if none are yet
64
+ // available due to fresh startup
65
+ d .peers .lock .RLock ()
66
+ defer d .peers .lock .RUnlock ()
59
67
68
+ for _ , peer := range d .peers .peers {
60
69
if peer == nil {
61
- time .Sleep (time .Second )
62
- continue
70
+ return nil , errors .New ("could not find peer" )
63
71
}
64
72
// Found a peer, attempt to retrieve the header whilst blocking and
65
73
// retry if it fails for whatever reason
66
- log .Info ("Attempting to retrieve sync target" , "peer" , peer .id )
74
+ log .Debug ("Attempting to retrieve sync target" , "peer" , peer .id , "hash" , hash )
67
75
headers , metas , err := d .fetchHeadersByHash (peer , hash , 1 , 0 , false )
68
76
if err != nil || len (headers ) != 1 {
69
- log .Warn ("Failed to fetch sync target" , "headers" , len (headers ), "err" , err )
70
- time .Sleep (time .Second )
71
77
continue
72
78
}
73
79
// Head header retrieved, if the hash matches, start the actual sync
74
80
if metas [0 ] != hash {
75
- log .Error ("Received invalid sync target" , "want" , hash , "have" , metas [0 ])
76
- time .Sleep (time .Second )
81
+ log .Warn ("Received invalid sync target" , "peer" , peer .id , "want" , hash , "have" , metas [0 ])
77
82
continue
78
83
}
79
- return d . BeaconSync ( mode , headers [0 ], headers [ 0 ])
84
+ return headers [0 ], nil
80
85
}
86
+ return nil , errors .New ("failed to fetch sync target" )
81
87
}
0 commit comments