|
|
|
@ -53,6 +53,7 @@ type fetchRequest struct { |
|
|
|
|
type fetchResponse struct { |
|
|
|
|
reqID uint64 |
|
|
|
|
headers []*types.Header |
|
|
|
|
peer *peer |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func newLightFetcher(pm *ProtocolManager) *lightFetcher { |
|
|
|
@ -148,8 +149,8 @@ func (f *lightFetcher) nextRequest() (*peer, *announceData) { |
|
|
|
|
return bestPeer, res |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (f *lightFetcher) deliverHeaders(reqID uint64, headers []*types.Header) { |
|
|
|
|
f.deliverChn <- fetchResponse{reqID: reqID, headers: headers} |
|
|
|
|
func (f *lightFetcher) deliverHeaders(peer *peer, reqID uint64, headers []*types.Header) { |
|
|
|
|
f.deliverChn <- fetchResponse{reqID: reqID, headers: headers, peer: peer} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (f *lightFetcher) requestedID(reqID uint64) bool { |
|
|
|
@ -280,11 +281,16 @@ func (f *lightFetcher) syncLoop() { |
|
|
|
|
//fmt.Println("<-f.deliverChn", f.syncing)
|
|
|
|
|
f.reqMu.Lock() |
|
|
|
|
req, ok := f.requested[resp.reqID] |
|
|
|
|
delete(f.requested, resp.reqID) |
|
|
|
|
if ok && req.peer != resp.peer { |
|
|
|
|
ok = false |
|
|
|
|
} |
|
|
|
|
if ok { |
|
|
|
|
delete(f.requested, resp.reqID) |
|
|
|
|
} |
|
|
|
|
f.reqMu.Unlock() |
|
|
|
|
if !ok || !(f.syncing || f.processResponse(req, resp)) { |
|
|
|
|
//fmt.Println("processResponse fail")
|
|
|
|
|
f.pm.removePeer(req.peer.id) |
|
|
|
|
f.pm.removePeer(resp.peer.id) |
|
|
|
|
} |
|
|
|
|
case <-f.syncDone: |
|
|
|
|
//fmt.Println("<-f.syncDone", f.syncing)
|
|
|
|
|