@@ -27,6 +27,7 @@ import (
2727 "github.com/libp2p/go-libp2p/core/peer"
2828 "github.com/multiformats/go-multiaddr"
2929 "github.com/samber/lo"
30+ "github.com/yugabyte/pgx/v5"
3031 "golang.org/x/xerrors"
3132
3233 "github.com/filecoin-project/go-address"
@@ -49,8 +50,8 @@ const IPNIRoutePath = "/ipni-provider/"
4950const IPNIPath = "/ipni/v1/ad/"
5051
5152// publishInterval represents the time interval between each publishing operation.
52- // It is set to 10 minutes.
53- const publishInterval = 10 * time .Minute
53+ // It is set to 30 seconds for the purposes of PDP index publishing
54+ const publishInterval = 5 * time .Second
5455const publishProviderSpacing = 10 * time .Second
5556
5657var (
@@ -73,6 +74,7 @@ type Provider struct {
7374 indexStore * indexstore.IndexStore
7475 sc * chunker.ServeChunker
7576 keys map [string ]* peerInfo // map[peerID String]Private_Key
77+ latest map [string ]cid.Cid // map[peerID String]last published head, used to avoid duplicate announce
7678 // announceURLs enables sending direct announcements via HTTP. This is
7779 // the list of indexer URLs to send direct HTTP announce messages to.
7880 announceURLs []* url.URL
@@ -103,8 +105,9 @@ func NewProvider(d *deps.Deps) (*Provider, error) {
103105 for rows .Next () && rows .Err () == nil {
104106 var priv []byte
105107 var peerID string
108+ var sp int64
106109 var spID abi.ActorID
107- err := rows .Scan (& priv , & peerID , & spID )
110+ err := rows .Scan (& priv , & peerID , & sp )
108111 if err != nil {
109112 return nil , xerrors .Errorf ("failed to scan the row: %w" , err )
110113 }
@@ -123,6 +126,12 @@ func NewProvider(d *deps.Deps) (*Provider, error) {
123126 return nil , xerrors .Errorf ("peer ID mismatch: got %s (calculated), expected %s (DB)" , id .String (), peerID )
124127 }
125128
129+ if sp < 0 {
130+ spID = abi .ActorID (0 )
131+ } else {
132+ spID = abi .ActorID (sp )
133+ }
134+
126135 maddr , err := address .NewIDAddress (uint64 (spID ))
127136 if err != nil {
128137 return nil , xerrors .Errorf ("parsing miner ID: %w" , err )
@@ -193,6 +202,7 @@ func NewProvider(d *deps.Deps) (*Provider, error) {
193202 keys : keyMap ,
194203 announceURLs : announceURLs ,
195204 httpServerAddresses : httpServerAddresses ,
205+ latest : make (map [string ]cid.Cid ),
196206 }, nil
197207}
198208
@@ -364,7 +374,7 @@ func (p *Provider) handleGet(w http.ResponseWriter, r *http.Request) {
364374 start := time .Now ()
365375
366376 defer func () {
367- log .Infow ("Served IPNI request" , "path" , r .URL .Path , "cid" , reqCid , "providerId" , providerID , "took" , time .Since (start ))
377+ log .Infow ("Served IPNI request" , "path" , r .URL .Path , "cid" , reqCid , "providerId" , providerID , "took" , time .Since (start ), "remote_addr" , r . RemoteAddr )
368378 }()
369379
370380 b , err := cid .Parse (reqCid )
@@ -477,7 +487,6 @@ func RemoveCidContact(slice []*url.URL) []*url.URL {
477487// StartPublishing starts a poller which publishes the head for each provider every 10 minutes.
478488func (p * Provider ) StartPublishing (ctx context.Context ) {
479489 var ticker * time.Ticker
480-
481490 // A poller which publishes head for each provider
482491 // every 10 minutes for mainnet build
483492 if build .BuildType == build .BuildMainnet {
@@ -489,12 +498,22 @@ func (p *Provider) StartPublishing(ctx context.Context) {
489498 return
490499 }
491500 log .Info ("Starting IPNI provider publishing for testnet build" )
501+ ticker = time .NewTicker (publishInterval )
492502 if build .BuildType != build .BuildCalibnet {
493503 ticker = time .NewTicker (time .Second * 10 )
494504 log .Info ("Resetting IPNI provider publishing ticker to 10 seconds for devnet build" )
495505 }
496506 }
497507
508+ // Populated latest head cid from the ipni_head table
509+ for provider := range p .keys {
510+ c , err := p .getHeadCID (ctx , provider )
511+ if err != nil {
512+ log .Errorw ("failed to get head CID" , "provider" , provider , "error" , err )
513+ continue
514+ }
515+ p .latest [provider ] = c
516+ }
498517 go func (ticker * time.Ticker ) {
499518 for {
500519 select {
@@ -518,6 +537,10 @@ func (p *Provider) StartPublishing(ctx context.Context) {
518537func (p * Provider ) getHeadCID (ctx context.Context , provider string ) (cid.Cid , error ) {
519538 var headStr string
520539 err := p .db .QueryRow (ctx , `SELECT head FROM ipni_head WHERE provider = $1` , provider ).Scan (& headStr )
540+ if err == pgx .ErrNoRows {
541+ log .Debugw ("no head CID yet for provider" , "provider" , provider )
542+ return cid .Undef , nil
543+ }
521544 if err != nil {
522545 return cid .Undef , xerrors .Errorf ("querying previous head: %w" , err )
523546 }
@@ -544,10 +567,17 @@ func (p *Provider) publishHead(ctx context.Context) {
544567 log .Errorw ("failed to get head CID" , "provider" , provider , "error" , err )
545568 continue
546569 }
570+ if _ , ok := p .latest [provider ]; ok && p .latest [provider ] == c {
571+ log .Debugw ("Skipping duplicate announce for provider" , "provider" , provider , "cid" , c .String ())
572+ continue
573+ }
574+
547575 log .Infow ("Publishing head for provider" , "provider" , provider , "cid" , c .String ())
548576 err = p .publishhttp (ctx , c , provider )
549577 if err != nil {
550578 log .Errorw ("failed to publish head for provide" , "provider" , provider , "error" , err )
579+ } else {
580+ p .latest [provider ] = c
551581 }
552582
553583 i ++
@@ -567,6 +597,7 @@ func (p *Provider) publishProviderSpacingWait() {
567597// It obtains the HTTP addresses for the peer and sends the announce message to those addresses.
568598func (p * Provider ) publishhttp (ctx context.Context , adCid cid.Cid , peer string ) error {
569599 // Create the http announce sender.
600+ log .Infow ("Creating http announce sender" , "urls" , p .announceURLs )
570601 httpSender , err := httpsender .New (p .announceURLs , p .keys [peer ].ID )
571602 if err != nil {
572603 return fmt .Errorf ("cannot create http announce sender: %w" , err )
@@ -577,7 +608,6 @@ func (p *Provider) publishhttp(ctx context.Context, adCid cid.Cid, peer string)
577608 return fmt .Errorf ("cannot create provider http addresses: %w" , err )
578609 }
579610
580- log .Infow ("Announcing advertisements over HTTP" , "urls" , p .announceURLs )
581611 return announce .Send (ctx , adCid , addrs , httpSender )
582612}
583613
0 commit comments