@@ -102,7 +102,7 @@ func (r *resolver) Deal(ctx context.Context, args struct{ ID graphql.ID }) (*dea
102
102
return nil , err
103
103
}
104
104
105
- return newDealResolver (deal , r .dealsDB , r .logsDB , r .spApi ), nil
105
+ return newDealResolver (deal , r .provider , r . dealsDB , r .logsDB , r .spApi ), nil
106
106
}
107
107
108
108
type dealsArgs struct {
@@ -135,7 +135,7 @@ func (r *resolver) Deals(ctx context.Context, args dealsArgs) (*dealListResolver
135
135
136
136
resolvers := make ([]* dealResolver , 0 , len (deals ))
137
137
for _ , deal := range deals {
138
- resolvers = append (resolvers , newDealResolver (& deal , r .dealsDB , r .logsDB , r .spApi ))
138
+ resolvers = append (resolvers , newDealResolver (& deal , r .provider , r . dealsDB , r .logsDB , r .spApi ))
139
139
}
140
140
141
141
return & dealListResolver {
@@ -168,7 +168,7 @@ func (r *resolver) DealUpdate(ctx context.Context, args struct{ ID graphql.ID })
168
168
}
169
169
170
170
net := make (chan * dealResolver , 1 )
171
- net <- newDealResolver (deal , r .dealsDB , r .logsDB , r .spApi )
171
+ net <- newDealResolver (deal , r .provider , r . dealsDB , r .logsDB , r .spApi )
172
172
173
173
// Updates to deal state are broadcast on pubsub. Pipe these updates to the
174
174
// client
@@ -180,7 +180,7 @@ func (r *resolver) DealUpdate(ctx context.Context, args struct{ ID graphql.ID })
180
180
}
181
181
return nil , fmt .Errorf ("%s: subscribing to deal updates: %w" , args .ID , err )
182
182
}
183
- sub := & subLastUpdate {sub : dealUpdatesSub , dealsDB : r .dealsDB , logsDB : r .logsDB , spApi : r .spApi }
183
+ sub := & subLastUpdate {sub : dealUpdatesSub , provider : r . provider , dealsDB : r .dealsDB , logsDB : r .logsDB , spApi : r .spApi }
184
184
go func () {
185
185
sub .Pipe (ctx , net ) // blocks until connection is closed
186
186
close (net )
@@ -219,7 +219,7 @@ func (r *resolver) DealNew(ctx context.Context) (<-chan *dealNewResolver, error)
219
219
case evti := <- sub .Out ():
220
220
// Pipe the deal to the new deal channel
221
221
di := evti .(types.ProviderDealState )
222
- rsv := newDealResolver (& di , r .dealsDB , r .logsDB , r .spApi )
222
+ rsv := newDealResolver (& di , r .provider , r . dealsDB , r .logsDB , r .spApi )
223
223
totalCount , err := r .dealsDB .Count (ctx , "" )
224
224
if err != nil {
225
225
log .Errorf ("getting total deal count: %w" , err )
@@ -330,15 +330,17 @@ func (r *resolver) dealList(ctx context.Context, query string, cursor *graphql.I
330
330
331
331
type dealResolver struct {
332
332
types.ProviderDealState
333
+ provider * storagemarket.Provider
333
334
transferred uint64
334
335
dealsDB * db.DealsDB
335
336
logsDB * db.LogsDB
336
337
spApi sealingpipeline.API
337
338
}
338
339
339
- func newDealResolver (deal * types.ProviderDealState , dealsDB * db.DealsDB , logsDB * db.LogsDB , spApi sealingpipeline.API ) * dealResolver {
340
+ func newDealResolver (deal * types.ProviderDealState , provider * storagemarket. Provider , dealsDB * db.DealsDB , logsDB * db.LogsDB , spApi sealingpipeline.API ) * dealResolver {
340
341
return & dealResolver {
341
342
ProviderDealState : * deal ,
343
+ provider : provider ,
342
344
transferred : uint64 (deal .NBytesReceived ),
343
345
dealsDB : dealsDB ,
344
346
logsDB : logsDB ,
@@ -502,13 +504,17 @@ func (dr *dealResolver) message(ctx context.Context, checkpoint dealcheckpoints.
502
504
if dr .IsOffline {
503
505
return "Awaiting Offline Data Import"
504
506
}
505
- switch dr . transferred {
506
- case 0 :
507
+ switch {
508
+ case dr . transferred == 0 && ! dr . provider . IsTransferStalled ( dr . DealUuid ) :
507
509
return "Transfer Queued"
508
- case 100 :
510
+ case dr . transferred == 100 :
509
511
return "Transfer Complete"
510
512
default :
511
513
pct := (100 * dr .transferred ) / dr .ProviderDealState .Transfer .Size
514
+ isStalled := dr .provider .IsTransferStalled (dr .DealUuid )
515
+ if isStalled {
516
+ return fmt .Sprintf ("Transfer stalled at %d%% " , pct )
517
+ }
512
518
return fmt .Sprintf ("Transferring %d%%" , pct )
513
519
}
514
520
case dealcheckpoints .Transferred :
@@ -533,6 +539,22 @@ func (dr *dealResolver) message(ctx context.Context, checkpoint dealcheckpoints.
533
539
return checkpoint .String ()
534
540
}
535
541
542
+ func (dr * dealResolver ) TransferSamples () []* transferPoint {
543
+ points := dr .provider .Transfer (dr .DealUuid )
544
+ pts := make ([]* transferPoint , 0 , len (points ))
545
+ for _ , pt := range points {
546
+ pts = append (pts , & transferPoint {
547
+ At : graphql.Time {Time : pt .At },
548
+ Bytes : gqltypes .Uint64 (pt .Bytes ),
549
+ })
550
+ }
551
+ return pts
552
+ }
553
+
554
+ func (dr * dealResolver ) IsTransferStalled () bool {
555
+ return dr .provider .IsTransferStalled (dr .DealUuid )
556
+ }
557
+
536
558
func (dr * dealResolver ) sealingState (ctx context.Context ) string {
537
559
si , err := dr .spApi .SectorsStatus (ctx , dr .SectorID , false )
538
560
if err != nil {
@@ -594,10 +616,11 @@ func toUuid(id graphql.ID) (uuid.UUID, error) {
594
616
}
595
617
596
618
type subLastUpdate struct {
597
- sub event.Subscription
598
- dealsDB * db.DealsDB
599
- logsDB * db.LogsDB
600
- spApi sealingpipeline.API
619
+ sub event.Subscription
620
+ provider * storagemarket.Provider
621
+ dealsDB * db.DealsDB
622
+ logsDB * db.LogsDB
623
+ spApi sealingpipeline.API
601
624
}
602
625
603
626
func (s * subLastUpdate ) Pipe (ctx context.Context , net chan * dealResolver ) {
@@ -636,7 +659,7 @@ func (s *subLastUpdate) Pipe(ctx context.Context, net chan *dealResolver) {
636
659
loop:
637
660
for {
638
661
di := lastUpdate .(types.ProviderDealState )
639
- rsv := newDealResolver (& di , s .dealsDB , s .logsDB , s .spApi )
662
+ rsv := newDealResolver (& di , s .provider , s . dealsDB , s .logsDB , s .spApi )
640
663
641
664
select {
642
665
case <- ctx .Done ():
0 commit comments