@@ -51,7 +51,7 @@ func (tl *prq) Push(to peer.ID, entries ...wantlist.Entry) {
51
51
defer tl .lock .Unlock ()
52
52
partner , ok := tl .partners [to ]
53
53
if ! ok {
54
- partner = newActivePartner ()
54
+ partner = newActivePartner (to )
55
55
tl .pQueue .Push (partner )
56
56
tl .partners [to ] = partner
57
57
}
@@ -136,7 +136,13 @@ func (tl *prq) Pop() *peerRequestTask {
136
136
break // and return |out|
137
137
}
138
138
139
- tl .pQueue .Push (partner )
139
+ if partner .IsIdle () {
140
+ target := partner .target
141
+ delete (tl .partners , target )
142
+ delete (tl .frozen , target )
143
+ } else {
144
+ tl .pQueue .Push (partner )
145
+ }
140
146
return out
141
147
}
142
148
@@ -252,7 +258,7 @@ func wrapCmp(f func(a, b *peerRequestTask) bool) func(a, b pq.Elem) bool {
252
258
}
253
259
254
260
type activePartner struct {
255
-
261
+ target peer. ID
256
262
// Active is the number of blocks this peer is currently being sent
257
263
// active must be locked around as it will be updated externally
258
264
activelk sync.Mutex
@@ -274,8 +280,9 @@ type activePartner struct {
274
280
taskQueue pq.PQ
275
281
}
276
282
277
- func newActivePartner () * activePartner {
283
+ func newActivePartner (target peer. ID ) * activePartner {
278
284
return & activePartner {
285
+ target : target ,
279
286
taskQueue : pq .New (wrapCmp (V1 )),
280
287
activeBlocks : cid .NewSet (),
281
288
}
@@ -323,6 +330,7 @@ func (p *activePartner) StartTask(k cid.Cid) {
323
330
// TaskDone signals that a task was completed for this partner.
324
331
func (p * activePartner ) TaskDone (k cid.Cid ) {
325
332
p .activelk .Lock ()
333
+
326
334
p .activeBlocks .Remove (k )
327
335
p .active --
328
336
if p .active < 0 {
@@ -331,6 +339,12 @@ func (p *activePartner) TaskDone(k cid.Cid) {
331
339
p .activelk .Unlock ()
332
340
}
333
341
342
+ func (p * activePartner ) IsIdle () bool {
343
+ p .activelk .Lock ()
344
+ defer p .activelk .Unlock ()
345
+ return p .requests == 0 && p .active == 0
346
+ }
347
+
334
348
// Index implements pq.Elem.
335
349
func (p * activePartner ) Index () int {
336
350
return p .index
0 commit comments