6
6
"fmt"
7
7
"sync/atomic"
8
8
9
+ "github.com/ipfs/go-graphsync/listeners"
10
+ "github.com/ipfs/go-graphsync/messagequeue"
11
+
9
12
blocks "github.com/ipfs/go-block-format"
10
13
"github.com/ipfs/go-cid"
11
14
logging "github.com/ipfs/go-log"
@@ -74,6 +77,7 @@ type RequestManager struct {
74
77
requestHooks RequestHooks
75
78
responseHooks ResponseHooks
76
79
blockHooks BlockHooks
80
+ networkErrorListeners * listeners.NetworkErrorListeners
77
81
}
78
82
79
83
type requestManagerMessage interface {
@@ -100,7 +104,9 @@ func New(ctx context.Context,
100
104
asyncLoader AsyncLoader ,
101
105
requestHooks RequestHooks ,
102
106
responseHooks ResponseHooks ,
103
- blockHooks BlockHooks ) * RequestManager {
107
+ blockHooks BlockHooks ,
108
+ networkErrorListeners * listeners.NetworkErrorListeners ,
109
+ ) * RequestManager {
104
110
ctx , cancel := context .WithCancel (ctx )
105
111
return & RequestManager {
106
112
ctx : ctx ,
@@ -112,6 +118,7 @@ func New(ctx context.Context,
112
118
requestHooks : requestHooks ,
113
119
responseHooks : responseHooks ,
114
120
blockHooks : blockHooks ,
121
+ networkErrorListeners : networkErrorListeners ,
115
122
}
116
123
}
117
124
@@ -333,7 +340,7 @@ func (nrm *newRequestMessage) setupRequest(requestID graphsync.RequestID, rm *Re
333
340
rm .inProgressRequestStatuses [request .ID ()] = requestStatus
334
341
incoming , incomingError := executor.ExecutionEnv {
335
342
Ctx : rm .ctx ,
336
- SendRequest : rm .peerHandler . SendRequest ,
343
+ SendRequest : rm .sendRequest ,
337
344
TerminateRequest : rm .terminateRequest ,
338
345
RunBlockHooks : rm .processBlockHooks ,
339
346
Loader : rm .asyncLoader .AsyncLoad ,
@@ -375,7 +382,7 @@ func (crm *cancelRequestMessage) handle(rm *RequestManager) {
375
382
return
376
383
}
377
384
378
- rm .peerHandler . SendRequest (inProgressRequestStatus .p , gsmsg .CancelRequest (crm .requestID ))
385
+ rm .sendRequest (inProgressRequestStatus .p , gsmsg .CancelRequest (crm .requestID ))
379
386
if crm .isPause {
380
387
inProgressRequestStatus .paused = true
381
388
} else {
@@ -425,7 +432,7 @@ func (rm *RequestManager) processExtensionsForResponse(p peer.ID, response gsmsg
425
432
result := rm .responseHooks .ProcessResponseHooks (p , response )
426
433
if len (result .Extensions ) > 0 {
427
434
updateRequest := gsmsg .UpdateRequest (response .RequestID (), result .Extensions ... )
428
- rm .peerHandler . SendRequest (p , updateRequest )
435
+ rm .sendRequest (p , updateRequest )
429
436
}
430
437
if result .Err != nil {
431
438
requestStatus , ok := rm .inProgressRequestStatuses [response .RequestID ()]
@@ -437,7 +444,7 @@ func (rm *RequestManager) processExtensionsForResponse(p peer.ID, response gsmsg
437
444
case requestStatus .networkError <- responseError :
438
445
case <- requestStatus .ctx .Done ():
439
446
}
440
- rm .peerHandler . SendRequest (p , gsmsg .CancelRequest (response .RequestID ()))
447
+ rm .sendRequest (p , gsmsg .CancelRequest (response .RequestID ()))
441
448
requestStatus .cancelFn ()
442
449
return false
443
450
}
@@ -482,7 +489,7 @@ func (rm *RequestManager) processBlockHooks(p peer.ID, response graphsync.Respon
482
489
result := rm .blockHooks .ProcessBlockHooks (p , response , block )
483
490
if len (result .Extensions ) > 0 {
484
491
updateRequest := gsmsg .UpdateRequest (response .RequestID (), result .Extensions ... )
485
- rm .peerHandler . SendRequest (p , updateRequest )
492
+ rm .sendRequest (p , updateRequest )
486
493
}
487
494
if result .Err != nil {
488
495
_ , isPause := result .Err .(hooks.ErrPaused )
@@ -535,6 +542,34 @@ func (rm *RequestManager) validateRequest(requestID graphsync.RequestID, p peer.
535
542
return request , hooksResult , nil
536
543
}
537
544
545
+ type reqSubscriber struct {
546
+ p peer.ID
547
+ request gsmsg.GraphSyncRequest
548
+ networkErrorListeners * listeners.NetworkErrorListeners
549
+ }
550
+
551
+ func (r * reqSubscriber ) OnNext (topic notifications.Topic , event notifications.Event ) {
552
+ mqEvt , isMQEvt := event .(messagequeue.Event )
553
+ if ! isMQEvt || mqEvt .Name != messagequeue .Error {
554
+ return
555
+ }
556
+
557
+ r .networkErrorListeners .NotifyNetworkErrorListeners (r .p , r .request , mqEvt .Err )
558
+ //r.re.networkError <- mqEvt.Err
559
+ //r.re.terminateRequest()
560
+ }
561
+
562
+ func (r reqSubscriber ) OnClose (topic notifications.Topic ) {
563
+ }
564
+
565
+ const requestNetworkError = "request_network_error"
566
+
567
+ func (rm * RequestManager ) sendRequest (p peer.ID , request gsmsg.GraphSyncRequest ) {
568
+ sub := notifications .NewTopicDataSubscriber (& reqSubscriber {p , request , rm .networkErrorListeners })
569
+ failNotifee := notifications.Notifee {Data : requestNetworkError , Subscriber : sub }
570
+ rm .peerHandler .SendRequest (p , request , failNotifee )
571
+ }
572
+
538
573
func (urm * unpauseRequestMessage ) unpause (rm * RequestManager ) error {
539
574
inProgressRequestStatus , ok := rm .inProgressRequestStatuses [urm .id ]
540
575
if ! ok {
@@ -546,7 +581,7 @@ func (urm *unpauseRequestMessage) unpause(rm *RequestManager) error {
546
581
inProgressRequestStatus .paused = false
547
582
select {
548
583
case <- inProgressRequestStatus .pauseMessages :
549
- rm .peerHandler . SendRequest (inProgressRequestStatus .p , gsmsg .UpdateRequest (urm .id , urm .extensions ... ))
584
+ rm .sendRequest (inProgressRequestStatus .p , gsmsg .UpdateRequest (urm .id , urm .extensions ... ))
550
585
return nil
551
586
case <- rm .ctx .Done ():
552
587
return errors .New ("context cancelled" )
0 commit comments