@@ -69,9 +69,9 @@ type sentReq struct {
69
69
lock sync.RWMutex // protect access to sentTo map
70
70
sentTo map [distPeer ]sentReqToPeer
71
71
72
- reqQueued bool // a request has been queued but not sent
73
- reqSent bool // a request has been sent but not timed out
74
- reqSrtoCount int // number of requests that reached soft (but not hard) timeout
72
+ lastReqQueued bool // last request has been queued but not sent
73
+ lastReqSentTo distPeer // if not nil then last request has been sent to given peer but not timed out
74
+ reqSrtoCount int // number of requests that reached soft (but not hard) timeout
75
75
}
76
76
77
77
// sentReqToPeer notifies the request-from-peer goroutine (tryRequest) about a response
@@ -180,7 +180,7 @@ type reqStateFn func() reqStateFn
180
180
// retrieveLoop is the retrieval state machine event loop
181
181
func (r * sentReq ) retrieveLoop () {
182
182
go r .tryRequest ()
183
- r .reqQueued = true
183
+ r .lastReqQueued = true
184
184
state := r .stateRequesting
185
185
186
186
for state != nil {
@@ -214,7 +214,7 @@ func (r *sentReq) stateRequesting() reqStateFn {
214
214
case rpSoftTimeout :
215
215
// last request timed out, try asking a new peer
216
216
go r .tryRequest ()
217
- r .reqQueued = true
217
+ r .lastReqQueued = true
218
218
return r .stateRequesting
219
219
case rpDeliveredValid :
220
220
r .stop (nil )
@@ -233,7 +233,7 @@ func (r *sentReq) stateNoMorePeers() reqStateFn {
233
233
select {
234
234
case <- time .After (retryQueue ):
235
235
go r .tryRequest ()
236
- r .reqQueued = true
236
+ r .lastReqQueued = true
237
237
return r .stateRequesting
238
238
case ev := <- r .eventsCh :
239
239
r .update (ev )
@@ -260,22 +260,26 @@ func (r *sentReq) stateStopped() reqStateFn {
260
260
func (r * sentReq ) update (ev reqPeerEvent ) {
261
261
switch ev .event {
262
262
case rpSent :
263
- r .reqQueued = false
264
- if ev .peer != nil {
265
- r .reqSent = true
266
- }
263
+ r .lastReqQueued = false
264
+ r .lastReqSentTo = ev .peer
267
265
case rpSoftTimeout :
268
- r .reqSent = false
266
+ r .lastReqSentTo = nil
269
267
r .reqSrtoCount ++
270
- case rpHardTimeout , rpDeliveredValid , rpDeliveredInvalid :
268
+ case rpHardTimeout :
271
269
r .reqSrtoCount --
270
+ case rpDeliveredValid , rpDeliveredInvalid :
271
+ if ev .peer == r .lastReqSentTo {
272
+ r .lastReqSentTo = nil
273
+ } else {
274
+ r .reqSrtoCount --
275
+ }
272
276
}
273
277
}
274
278
275
279
// waiting returns true if the retrieval mechanism is waiting for an answer from
276
280
// any peer
277
281
func (r * sentReq ) waiting () bool {
278
- return r .reqQueued || r .reqSent || r .reqSrtoCount > 0
282
+ return r .lastReqQueued || r .lastReqSentTo != nil || r .reqSrtoCount > 0
279
283
}
280
284
281
285
// tryRequest tries to send the request to a new peer and waits for it to either
0 commit comments