Skip to content

Commit d5bad97

Browse files
committed
fix(requestmanager): correct cancel request sending
make sure not to send cancel when other peer has already sent terminal status
1 parent b80966d commit d5bad97

File tree

3 files changed

+8
-8
lines changed

3 files changed

+8
-8
lines changed

Diff for: requestmanager/executor/executor.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,9 @@ func (e *Executor) ExecuteTask(ctx context.Context, pid peer.ID, task *peertask.
7373
log.Debugw("beginning request execution", "id", requestTask.Request.ID(), "peer", pid.String(), "root_cid", requestTask.Request.Root().String())
7474
err := e.traverse(requestTask)
7575
if err != nil {
76-
e.manager.SendRequest(requestTask.P, gsmsg.CancelRequest(requestTask.Request.ID()))
76+
if !isContextErr(err) {
77+
e.manager.SendRequest(requestTask.P, gsmsg.CancelRequest(requestTask.Request.ID()))
78+
}
7779
if !isContextErr(err) && !isPausedErr(err) {
7880
select {
7981
case <-requestTask.Ctx.Done():

Diff for: requestmanager/executor/executor_test.go

+2-6
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,7 @@ func TestRequestExecutionBlockChain(t *testing.T) {
6666
verifyResults: func(t *testing.T, tbc *testutil.TestBlockChain, ree *requestExecutionEnv, responses []graphsync.ResponseProgress, receivedErrors []error) {
6767
tbc.VerifyResponseRangeSync(responses, 0, 6)
6868
require.Empty(t, receivedErrors)
69-
require.Len(t, ree.requestsSent, 2)
70-
require.Equal(t, ree.request, ree.requestsSent[0].request)
71-
require.True(t, ree.requestsSent[1].request.IsCancel())
69+
require.Equal(t, []requestSent{{ree.p, ree.request}}, ree.requestsSent)
7270
require.Len(t, ree.blookHooksCalled, 6)
7371
require.EqualError(t, ree.terminalError, ipldutil.ContextCancelError{}.Error())
7472
},
@@ -265,7 +263,6 @@ type pauseKey struct {
265263
type requestExecutionEnv struct {
266264
// params
267265
ctx context.Context
268-
cancelFn func()
269266
request gsmsg.GraphSyncRequest
270267
p peer.ID
271268
blockHookResults map[blockHookKey]hooks.UpdateResult
@@ -276,7 +273,6 @@ type requestExecutionEnv struct {
276273
traverser ipldutil.Traverser
277274
inProgressErr chan error
278275
initialRequest bool
279-
empty bool
280276

281277
// results
282278
requestsSent []requestSent
@@ -307,7 +303,7 @@ func (ree *requestExecutionEnv) GetRequestTask(_ peer.ID, _ *peertask.Task, requ
307303
Traverser: ree.traverser,
308304
P: ree.p,
309305
InProgressErr: ree.inProgressErr,
310-
Empty: ree.empty,
306+
Empty: false,
311307
InitialRequest: ree.initialRequest,
312308
}
313309
go func() {

Diff for: requestmanager/server.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@ func (rm *RequestManager) cancelRequest(requestID graphsync.RequestID, onTermina
198198
if onTerminated != nil {
199199
inProgressRequestStatus.onTerminated = append(inProgressRequestStatus.onTerminated, onTerminated)
200200
}
201+
rm.SendRequest(inProgressRequestStatus.p, gsmsg.CancelRequest(requestID))
201202
rm.cancelOnError(requestID, inProgressRequestStatus, terminalError)
202203
}
203204

@@ -263,6 +264,7 @@ func (rm *RequestManager) processExtensionsForResponse(p peer.ID, response gsmsg
263264
if !ok {
264265
return false
265266
}
267+
rm.SendRequest(requestStatus.p, gsmsg.CancelRequest(response.RequestID()))
266268
rm.cancelOnError(response.RequestID(), requestStatus, result.Err)
267269
return false
268270
}
@@ -333,7 +335,7 @@ func (rm *RequestManager) pause(id graphsync.RequestID) error {
333335
if !ok {
334336
return graphsync.RequestNotFoundErr{}
335337
}
336-
if inProgressRequestStatus.state != running {
338+
if inProgressRequestStatus.state == paused {
337339
return errors.New("request is already paused")
338340
}
339341
select {

0 commit comments

Comments
 (0)