@@ -12,10 +12,13 @@ import (
12
12
"github.com/davecgh/go-spew/spew"
13
13
"github.com/filecoin-project/boost/api"
14
14
"github.com/filecoin-project/boost/db"
15
+ "github.com/filecoin-project/boost/indexprovider"
16
+ "github.com/filecoin-project/boost/piecedirectory"
15
17
"github.com/filecoin-project/boost/storagemarket/logs"
16
18
"github.com/filecoin-project/boost/storagemarket/types"
17
19
smtypes "github.com/filecoin-project/boost/storagemarket/types"
18
20
"github.com/filecoin-project/boost/storagemarket/types/dealcheckpoints"
21
+ "github.com/filecoin-project/boostd-data/model"
19
22
"github.com/filecoin-project/go-address"
20
23
"github.com/filecoin-project/go-state-types/abi"
21
24
"github.com/filecoin-project/go-state-types/builtin/v12/miner"
@@ -52,9 +55,13 @@ type DirectDealsProvider struct {
52
55
53
56
runningLk sync.RWMutex
54
57
running map [uuid.UUID ]struct {}
58
+
59
+ piecedirectory * piecedirectory.PieceDirectory
60
+ ip * indexprovider.Wrapper
55
61
}
56
62
57
- func NewDirectDealsProvider (cfg DDPConfig , fullnodeApi v1api.FullNode , pieceAdder types.PieceAdder , commpCalc smtypes.CommpCalculator , directDealsDB * db.DirectDataDB , dealLogger * logs.DealLogger ) * DirectDealsProvider {
63
+ func NewDirectDealsProvider (cfg DDPConfig , fullnodeApi v1api.FullNode , pieceAdder types.PieceAdder , commpCalc smtypes.CommpCalculator , directDealsDB * db.DirectDataDB , dealLogger * logs.DealLogger ,
64
+ piecedirectory * piecedirectory.PieceDirectory , ip * indexprovider.Wrapper ) * DirectDealsProvider {
58
65
return & DirectDealsProvider {
59
66
config : cfg ,
60
67
fullnodeApi : fullnodeApi ,
@@ -66,8 +73,10 @@ func NewDirectDealsProvider(cfg DDPConfig, fullnodeApi v1api.FullNode, pieceAdde
66
73
//logsSqlDB: logsSqlDB,
67
74
//logsDB: logsDB,
68
75
69
- dealLogger : dealLogger ,
70
- running : make (map [uuid.UUID ]struct {}),
76
+ dealLogger : dealLogger ,
77
+ running : make (map [uuid.UUID ]struct {}),
78
+ piecedirectory : piecedirectory ,
79
+ ip : ip ,
71
80
}
72
81
}
73
82
@@ -295,6 +304,8 @@ func (ddp *DirectDealsProvider) execDeal(ctx context.Context, entry *smtypes.Dir
295
304
}
296
305
}
297
306
307
+ entry .InboundFileSize = fstat .Size ()
308
+
298
309
log .Infow ("direct deal details" , "filepath" , entry .InboundFilePath , "supplied-piececid" , entry .PieceCID , "calculated-piececid" , generatedPieceInfo .PieceCID , "calculated-piecesize" , generatedPieceInfo .Size , "os stat size" , fstat .Size ())
299
310
300
311
if ! entry .PieceCID .Equals (generatedPieceInfo .PieceCID ) {
@@ -399,9 +410,19 @@ func (ddp *DirectDealsProvider) execDeal(ctx context.Context, entry *smtypes.Dir
399
410
}
400
411
}
401
412
402
- if entry .Checkpoint <= dealcheckpoints .AddedPiece {
403
- // add index and announce
404
- ddp .dealLogger .Infow (dealUuid , "index and announce" )
413
+ // Index and announce the deal
414
+ if entry .Checkpoint < dealcheckpoints .IndexedAndAnnounced {
415
+ if err := ddp .indexAndAnnounce (ctx , entry ); err != nil {
416
+ err .error = fmt .Errorf ("failed to add index and announce deal: %w" , err .error )
417
+ return err
418
+ }
419
+ if entry .AnnounceToIPNI {
420
+ ddp .dealLogger .Infow (entry .ID , "deal successfully indexed and announced" )
421
+ } else {
422
+ ddp .dealLogger .Infow (entry .ID , "deal successfully indexed" )
423
+ }
424
+ } else {
425
+ ddp .dealLogger .Infow (entry .ID , "deal has already been indexed and announced" )
405
426
}
406
427
407
428
return nil
@@ -507,3 +528,49 @@ func (ddp *DirectDealsProvider) FailPausedDeal(ctx context.Context, id uuid.UUID
507
528
508
529
return nil
509
530
}
531
+
532
+ func (ddp * DirectDealsProvider ) indexAndAnnounce (ctx context.Context , entry * smtypes.DirectDeal ) * dealMakingError {
533
+ // add deal to piece metadata store
534
+ ddp .dealLogger .Infow (entry .ID , "about to add direct deal for piece in LID" )
535
+ if err := ddp .piecedirectory .AddDealForPiece (ctx , entry .PieceCID , model.DealInfo {
536
+ DealUuid : entry .ID .String (),
537
+ ChainDealID : abi .DealID (entry .AllocationID ), // Convert the type to avoid migration as underlying types are same
538
+ MinerAddr : entry .Provider ,
539
+ SectorID : entry .SectorID ,
540
+ PieceOffset : entry .Offset ,
541
+ PieceLength : entry .Length ,
542
+ CarLength : uint64 (entry .InboundFileSize ),
543
+ }); err != nil {
544
+ return & dealMakingError {
545
+ retry : types .DealRetryAuto ,
546
+ error : fmt .Errorf ("failed to add deal to piece metadata store: %w" , err ),
547
+ }
548
+ }
549
+ ddp .dealLogger .Infow (entry .ID , "direct deal successfully added to LID" )
550
+
551
+ // if the index provider is enabled
552
+ if ddp .ip .Enabled () {
553
+ if entry .AnnounceToIPNI {
554
+ // announce to the network indexer but do not fail the deal if the announcement fails,
555
+ // just retry the next time boost restarts
556
+ annCid , err := ddp .ip .AnnounceBoostDirectDeal (ctx , entry )
557
+ if err != nil {
558
+ return & dealMakingError {
559
+ retry : types .DealRetryAuto ,
560
+ error : fmt .Errorf ("failed to announce deal to network indexer: %w" , err ),
561
+ }
562
+ }
563
+ ddp .dealLogger .Infow (entry .ID , "announced the direct deal to network indexer" , "announcement-cid" , annCid )
564
+ } else {
565
+ ddp .dealLogger .Infow (entry .ID , "didn't announce the direct deal as requested in the deal proposal" )
566
+ }
567
+ } else {
568
+ ddp .dealLogger .Infow (entry .ID , "didn't announce the direct deal because network indexer is disabled" )
569
+ }
570
+
571
+ if derr := ddp .updateCheckpoint (ctx , entry , dealcheckpoints .IndexedAndAnnounced ); derr != nil {
572
+ return derr
573
+ }
574
+
575
+ return nil
576
+ }
0 commit comments