@@ -154,18 +154,19 @@ func New(ctx context.Context,
154
154
155
155
// ProcessRequests processes incoming requests for the given peer
156
156
func (rm * ResponseManager ) ProcessRequests (ctx context.Context , p peer.ID , requests []gsmsg.GraphSyncRequest ) {
157
- rm .send (& processRequestsMessage {p , requests }, ctx .Done ())
157
+ _ = rm .send (& processRequestsMessage {p , requests }, ctx .Done ())
158
158
}
159
159
160
160
// UnpauseResponse unpauses a response that was previously paused
161
161
func (rm * ResponseManager ) UnpauseResponse (ctx context.Context , requestID graphsync.RequestID , extensions ... graphsync.ExtensionData ) error {
162
162
response := make (chan error , 1 )
163
- rm .send (& unpauseRequestMessage {requestID , response , extensions }, ctx .Done ())
163
+ err := rm .send (& unpauseRequestMessage {requestID , response , extensions }, ctx .Done ())
164
+ if err != nil {
165
+ return err
166
+ }
164
167
select {
165
168
case <- rm .ctx .Done ():
166
169
return errors .New ("context cancelled" )
167
- case <- ctx .Done ():
168
- return errors .New ("context cancelled" )
169
170
case err := <- response :
170
171
return err
171
172
}
@@ -174,12 +175,13 @@ func (rm *ResponseManager) UnpauseResponse(ctx context.Context, requestID graphs
174
175
// PauseResponse pauses an in progress response (may take 1 or more blocks to process)
175
176
func (rm * ResponseManager ) PauseResponse (ctx context.Context , requestID graphsync.RequestID ) error {
176
177
response := make (chan error , 1 )
177
- rm .send (& pauseRequestMessage {requestID , response }, ctx .Done ())
178
+ err := rm .send (& pauseRequestMessage {requestID , response }, ctx .Done ())
179
+ if err != nil {
180
+ return err
181
+ }
178
182
select {
179
183
case <- rm .ctx .Done ():
180
184
return errors .New ("context cancelled" )
181
- case <- ctx .Done ():
182
- return errors .New ("context cancelled" )
183
185
case err := <- response :
184
186
return err
185
187
}
@@ -188,12 +190,13 @@ func (rm *ResponseManager) PauseResponse(ctx context.Context, requestID graphsyn
188
190
// CancelResponse cancels an in progress response
189
191
func (rm * ResponseManager ) CancelResponse (ctx context.Context , requestID graphsync.RequestID ) error {
190
192
response := make (chan error , 1 )
191
- rm .send (& errorRequestMessage {requestID , queryexecutor .ErrCancelledByCommand , response }, ctx .Done ())
193
+ err := rm .send (& errorRequestMessage {requestID , queryexecutor .ErrCancelledByCommand , response }, ctx .Done ())
194
+ if err != nil {
195
+ return err
196
+ }
192
197
select {
193
198
case <- rm .ctx .Done ():
194
199
return errors .New ("context cancelled" )
195
- case <- ctx .Done ():
196
- return errors .New ("context cancelled" )
197
200
case err := <- response :
198
201
return err
199
202
}
@@ -202,12 +205,13 @@ func (rm *ResponseManager) CancelResponse(ctx context.Context, requestID graphsy
202
205
// UpdateRequest updates an in progress response
203
206
func (rm * ResponseManager ) UpdateResponse (ctx context.Context , requestID graphsync.RequestID , extensions ... graphsync.ExtensionData ) error {
204
207
response := make (chan error , 1 )
205
- rm .send (& updateRequestMessage {requestID , extensions , response }, ctx .Done ())
208
+ err := rm .send (& updateRequestMessage {requestID , extensions , response }, ctx .Done ())
209
+ if err != nil {
210
+ return err
211
+ }
206
212
select {
207
213
case <- rm .ctx .Done ():
208
214
return errors .New ("context cancelled" )
209
- case <- ctx .Done ():
210
- return errors .New ("context cancelled" )
211
215
case err := <- response :
212
216
return err
213
217
}
@@ -216,7 +220,7 @@ func (rm *ResponseManager) UpdateResponse(ctx context.Context, requestID graphsy
216
220
// Synchronize is a utility method that blocks until all current messages are processed
217
221
func (rm * ResponseManager ) synchronize () {
218
222
sync := make (chan error )
219
- rm .send (& synchronizeMessage {sync }, nil )
223
+ _ = rm .send (& synchronizeMessage {sync }, nil )
220
224
select {
221
225
case <- rm .ctx .Done ():
222
226
case <- sync :
@@ -225,18 +229,18 @@ func (rm *ResponseManager) synchronize() {
225
229
226
230
// StartTask starts the given task from the peer task queue
227
231
func (rm * ResponseManager ) StartTask (task * peertask.Task , p peer.ID , responseTaskChan chan <- queryexecutor.ResponseTask ) {
228
- rm .send (& startTaskRequest {task , p , responseTaskChan }, nil )
232
+ _ = rm .send (& startTaskRequest {task , p , responseTaskChan }, nil )
229
233
}
230
234
231
235
// GetUpdates is called to read pending updates for a task and clear them
232
236
func (rm * ResponseManager ) GetUpdates (requestID graphsync.RequestID , updatesChan chan <- []gsmsg.GraphSyncRequest ) {
233
- rm .send (& responseUpdateRequest {requestID , updatesChan }, nil )
237
+ _ = rm .send (& responseUpdateRequest {requestID , updatesChan }, nil )
234
238
}
235
239
236
240
// FinishTask marks a task from the task queue as done
237
241
func (rm * ResponseManager ) FinishTask (task * peertask.Task , p peer.ID , err error ) {
238
242
done := make (chan struct {}, 1 )
239
- rm .send (& finishTaskRequest {task , p , err , done }, nil )
243
+ _ = rm .send (& finishTaskRequest {task , p , err , done }, nil )
240
244
select {
241
245
case <- rm .ctx .Done ():
242
246
case <- done :
@@ -246,7 +250,7 @@ func (rm *ResponseManager) FinishTask(task *peertask.Task, p peer.ID, err error)
246
250
// CloseWithNetworkError closes a request due to a network error
247
251
func (rm * ResponseManager ) CloseWithNetworkError (requestID graphsync.RequestID ) {
248
252
done := make (chan error , 1 )
249
- rm .send (& errorRequestMessage {requestID , queryexecutor .ErrNetworkError , done }, nil )
253
+ _ = rm .send (& errorRequestMessage {requestID , queryexecutor .ErrNetworkError , done }, nil )
250
254
select {
251
255
case <- rm .ctx .Done ():
252
256
case <- done :
@@ -256,7 +260,7 @@ func (rm *ResponseManager) CloseWithNetworkError(requestID graphsync.RequestID)
256
260
// TerminateRequest indicates a request has finished sending data and should no longer be tracked
257
261
func (rm * ResponseManager ) TerminateRequest (requestID graphsync.RequestID ) {
258
262
done := make (chan struct {}, 1 )
259
- rm .send (& terminateRequestMessage {requestID , done }, nil )
263
+ _ = rm .send (& terminateRequestMessage {requestID , done }, nil )
260
264
select {
261
265
case <- rm .ctx .Done ():
262
266
case <- done :
@@ -266,7 +270,7 @@ func (rm *ResponseManager) TerminateRequest(requestID graphsync.RequestID) {
266
270
// PeerState gets current state of the outgoing responses for a given peer
267
271
func (rm * ResponseManager ) PeerState (p peer.ID ) peerstate.PeerState {
268
272
response := make (chan peerstate.PeerState )
269
- rm .send (& peerStateMessage {p , response }, nil )
273
+ _ = rm .send (& peerStateMessage {p , response }, nil )
270
274
select {
271
275
case <- rm .ctx .Done ():
272
276
return peerstate.PeerState {}
@@ -275,11 +279,20 @@ func (rm *ResponseManager) PeerState(p peer.ID) peerstate.PeerState {
275
279
}
276
280
}
277
281
278
- func (rm * ResponseManager ) send (message responseManagerMessage , done <- chan struct {}) {
282
+ func (rm * ResponseManager ) send (message responseManagerMessage , done <- chan struct {}) error {
283
+ // prioritize cancelled context
284
+ select {
285
+ case <- done :
286
+ return errors .New ("unable to send message before cancellation" )
287
+ default :
288
+ }
279
289
select {
280
290
case <- rm .ctx .Done ():
291
+ return rm .ctx .Err ()
281
292
case <- done :
293
+ return errors .New ("unable to send message before cancellation" )
282
294
case rm .messages <- message :
295
+ return nil
283
296
}
284
297
}
285
298
0 commit comments