Skip to content

Commit 07412b0

Browse files
authored
fix(graphsync): fix potential lock on context cancel (#391)
1 parent dc8dc0f commit 07412b0

File tree

3 files changed

+33
-0
lines changed

3 files changed

+33
-0
lines changed

requestmanager/client.go

+10
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,8 @@ func (rm *RequestManager) NewRequest(ctx context.Context,
191191
select {
192192
case <-rm.ctx.Done():
193193
return rm.emptyResponse()
194+
case <-ctx.Done():
195+
return rm.emptyResponse()
194196
case receivedInProgressRequest = <-inProgressRequestChan:
195197
}
196198

@@ -284,6 +286,8 @@ func (rm *RequestManager) CancelRequest(ctx context.Context, requestID graphsync
284286
select {
285287
case <-rm.ctx.Done():
286288
return errors.New("context cancelled")
289+
case <-ctx.Done():
290+
return errors.New("context cancelled")
287291
case err := <-terminated:
288292
return err
289293
}
@@ -306,6 +310,8 @@ func (rm *RequestManager) UnpauseRequest(ctx context.Context, requestID graphsyn
306310
select {
307311
case <-rm.ctx.Done():
308312
return errors.New("context cancelled")
313+
case <-ctx.Done():
314+
return errors.New("context cancelled")
309315
case err := <-response:
310316
return err
311317
}
@@ -318,6 +324,8 @@ func (rm *RequestManager) PauseRequest(ctx context.Context, requestID graphsync.
318324
select {
319325
case <-rm.ctx.Done():
320326
return errors.New("context cancelled")
327+
case <-ctx.Done():
328+
return errors.New("context cancelled")
321329
case err := <-response:
322330
return err
323331
}
@@ -330,6 +338,8 @@ func (rm *RequestManager) UpdateRequest(ctx context.Context, requestID graphsync
330338
select {
331339
case <-rm.ctx.Done():
332340
return errors.New("context cancelled")
341+
case <-ctx.Done():
342+
return errors.New("context cancelled")
333343
case err := <-response:
334344
return err
335345
}

requestmanager/requestmanager_test.go

+15
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,21 @@ func TestCancelRequestImperativeNoMoreBlocks(t *testing.T) {
181181
require.True(t, ok)
182182
}
183183

184+
func TestCommandsWithCancelledContext(t *testing.T) {
185+
ctx := context.Background()
186+
managerCtx, managerCancel := context.WithCancel(ctx)
187+
defer managerCancel()
188+
td := newTestData(managerCtx, t)
189+
peers := testutil.GeneratePeers(1)
190+
191+
cancelledCtx, cancel := context.WithCancel(ctx)
192+
cancel()
193+
194+
returnedResponseChan, returnedErrorChan := td.requestManager.NewRequest(cancelledCtx, peers[0], td.blockChain.TipLink, td.blockChain.Selector())
195+
testutil.VerifyEmptyErrors(managerCtx, t, returnedErrorChan)
196+
testutil.VerifyEmptyResponse(managerCtx, t, returnedResponseChan)
197+
}
198+
184199
func TestCancelManagerExitsGracefully(t *testing.T) {
185200
ctx := context.Background()
186201
managerCtx, managerCancel := context.WithCancel(ctx)

responsemanager/client.go

+8
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,8 @@ func (rm *ResponseManager) UnpauseResponse(ctx context.Context, requestID graphs
164164
select {
165165
case <-rm.ctx.Done():
166166
return errors.New("context cancelled")
167+
case <-ctx.Done():
168+
return errors.New("context cancelled")
167169
case err := <-response:
168170
return err
169171
}
@@ -176,6 +178,8 @@ func (rm *ResponseManager) PauseResponse(ctx context.Context, requestID graphsyn
176178
select {
177179
case <-rm.ctx.Done():
178180
return errors.New("context cancelled")
181+
case <-ctx.Done():
182+
return errors.New("context cancelled")
179183
case err := <-response:
180184
return err
181185
}
@@ -188,6 +192,8 @@ func (rm *ResponseManager) CancelResponse(ctx context.Context, requestID graphsy
188192
select {
189193
case <-rm.ctx.Done():
190194
return errors.New("context cancelled")
195+
case <-ctx.Done():
196+
return errors.New("context cancelled")
191197
case err := <-response:
192198
return err
193199
}
@@ -200,6 +206,8 @@ func (rm *ResponseManager) UpdateResponse(ctx context.Context, requestID graphsy
200206
select {
201207
case <-rm.ctx.Done():
202208
return errors.New("context cancelled")
209+
case <-ctx.Done():
210+
return errors.New("context cancelled")
203211
case err := <-response:
204212
return err
205213
}

0 commit comments

Comments
 (0)