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