|
@@ -141,36 +141,39 @@ func (f *lightFetcher) syncLoop() {
|
|
|
s := requesting
|
|
s := requesting
|
|
|
requesting = false
|
|
requesting = false
|
|
|
var (
|
|
var (
|
|
|
- rq *distReq
|
|
|
|
|
- reqID uint64
|
|
|
|
|
|
|
+ rq *distReq
|
|
|
|
|
+ reqID uint64
|
|
|
|
|
+ syncing bool
|
|
|
)
|
|
)
|
|
|
if !f.syncing && !(newAnnounce && s) {
|
|
if !f.syncing && !(newAnnounce && s) {
|
|
|
- rq, reqID = f.nextRequest()
|
|
|
|
|
|
|
+ rq, reqID, syncing = f.nextRequest()
|
|
|
}
|
|
}
|
|
|
- syncing := f.syncing
|
|
|
|
|
f.lock.Unlock()
|
|
f.lock.Unlock()
|
|
|
|
|
|
|
|
if rq != nil {
|
|
if rq != nil {
|
|
|
requesting = true
|
|
requesting = true
|
|
|
- _, ok := <-f.pm.reqDist.queue(rq)
|
|
|
|
|
- if !ok {
|
|
|
|
|
|
|
+ if _, ok := <-f.pm.reqDist.queue(rq); ok {
|
|
|
|
|
+ if syncing {
|
|
|
|
|
+ f.lock.Lock()
|
|
|
|
|
+ f.syncing = true
|
|
|
|
|
+ f.lock.Unlock()
|
|
|
|
|
+ } else {
|
|
|
|
|
+ go func() {
|
|
|
|
|
+ time.Sleep(softRequestTimeout)
|
|
|
|
|
+ f.reqMu.Lock()
|
|
|
|
|
+ req, ok := f.requested[reqID]
|
|
|
|
|
+ if ok {
|
|
|
|
|
+ req.timeout = true
|
|
|
|
|
+ f.requested[reqID] = req
|
|
|
|
|
+ }
|
|
|
|
|
+ f.reqMu.Unlock()
|
|
|
|
|
+ // keep starting new requests while possible
|
|
|
|
|
+ f.requestChn <- false
|
|
|
|
|
+ }()
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
f.requestChn <- false
|
|
f.requestChn <- false
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- if !syncing {
|
|
|
|
|
- go func() {
|
|
|
|
|
- time.Sleep(softRequestTimeout)
|
|
|
|
|
- f.reqMu.Lock()
|
|
|
|
|
- req, ok := f.requested[reqID]
|
|
|
|
|
- if ok {
|
|
|
|
|
- req.timeout = true
|
|
|
|
|
- f.requested[reqID] = req
|
|
|
|
|
- }
|
|
|
|
|
- f.reqMu.Unlock()
|
|
|
|
|
- // keep starting new requests while possible
|
|
|
|
|
- f.requestChn <- false
|
|
|
|
|
- }()
|
|
|
|
|
- }
|
|
|
|
|
}
|
|
}
|
|
|
case reqID := <-f.timeoutChn:
|
|
case reqID := <-f.timeoutChn:
|
|
|
f.reqMu.Lock()
|
|
f.reqMu.Lock()
|
|
@@ -209,6 +212,7 @@ func (f *lightFetcher) syncLoop() {
|
|
|
f.checkSyncedHeaders(p)
|
|
f.checkSyncedHeaders(p)
|
|
|
f.syncing = false
|
|
f.syncing = false
|
|
|
f.lock.Unlock()
|
|
f.lock.Unlock()
|
|
|
|
|
+ f.requestChn <- false
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -405,7 +409,7 @@ func (f *lightFetcher) requestedID(reqID uint64) bool {
|
|
|
|
|
|
|
|
// nextRequest selects the peer and announced head to be requested next, amount
|
|
// nextRequest selects the peer and announced head to be requested next, amount
|
|
|
// to be downloaded starting from the head backwards is also returned
|
|
// to be downloaded starting from the head backwards is also returned
|
|
|
-func (f *lightFetcher) nextRequest() (*distReq, uint64) {
|
|
|
|
|
|
|
+func (f *lightFetcher) nextRequest() (*distReq, uint64, bool) {
|
|
|
var (
|
|
var (
|
|
|
bestHash common.Hash
|
|
bestHash common.Hash
|
|
|
bestAmount uint64
|
|
bestAmount uint64
|
|
@@ -427,14 +431,12 @@ func (f *lightFetcher) nextRequest() (*distReq, uint64) {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
if bestTd == f.maxConfirmedTd {
|
|
if bestTd == f.maxConfirmedTd {
|
|
|
- return nil, 0
|
|
|
|
|
|
|
+ return nil, 0, false
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- f.syncing = bestSyncing
|
|
|
|
|
-
|
|
|
|
|
var rq *distReq
|
|
var rq *distReq
|
|
|
reqID := genReqID()
|
|
reqID := genReqID()
|
|
|
- if f.syncing {
|
|
|
|
|
|
|
+ if bestSyncing {
|
|
|
rq = &distReq{
|
|
rq = &distReq{
|
|
|
getCost: func(dp distPeer) uint64 {
|
|
getCost: func(dp distPeer) uint64 {
|
|
|
return 0
|
|
return 0
|
|
@@ -500,7 +502,7 @@ func (f *lightFetcher) nextRequest() (*distReq, uint64) {
|
|
|
},
|
|
},
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- return rq, reqID
|
|
|
|
|
|
|
+ return rq, reqID, bestSyncing
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// deliverHeaders delivers header download request responses for processing
|
|
// deliverHeaders delivers header download request responses for processing
|