github.com/filecoin-project/bacalhau@v0.3.23-0.20230228154132-45c989550ace/pkg/requester/discovery/chained.go (about)

     1  package discovery
     2  
     3  import (
     4  	"context"
     5  	"reflect"
     6  
     7  	"github.com/filecoin-project/bacalhau/pkg/model"
     8  	"github.com/filecoin-project/bacalhau/pkg/requester"
     9  	"github.com/libp2p/go-libp2p/core/peer"
    10  	"github.com/rs/zerolog/log"
    11  )
    12  
    13  type Chain struct {
    14  	discoverers  []requester.NodeDiscoverer
    15  	ignoreErrors bool
    16  }
    17  
    18  func NewChain(ignoreErrors bool) *Chain {
    19  	return &Chain{
    20  		ignoreErrors: ignoreErrors,
    21  	}
    22  }
    23  
    24  func (c *Chain) Add(discoverer ...requester.NodeDiscoverer) {
    25  	c.discoverers = append(c.discoverers, discoverer...)
    26  }
    27  
    28  func (c *Chain) FindNodes(ctx context.Context, job model.Job) ([]model.NodeInfo, error) {
    29  	uniqueNodes := make(map[peer.ID]model.NodeInfo, 0)
    30  	for _, discoverer := range c.discoverers {
    31  		nodeInfos, err := discoverer.FindNodes(ctx, job)
    32  		if err != nil {
    33  			if !c.ignoreErrors {
    34  				return nil, err
    35  			} else {
    36  				log.Ctx(ctx).Warn().Err(err).Msgf("ignoring error finding nodes by %s", reflect.TypeOf(discoverer))
    37  			}
    38  		}
    39  		currentNodesCount := len(uniqueNodes)
    40  		for _, nodeInfo := range nodeInfos {
    41  			if _, ok := uniqueNodes[nodeInfo.PeerInfo.ID]; !ok {
    42  				uniqueNodes[nodeInfo.PeerInfo.ID] = nodeInfo
    43  			}
    44  		}
    45  		log.Ctx(ctx).Debug().Msgf("found %d more nodes by %s", len(uniqueNodes)-currentNodesCount, reflect.TypeOf(discoverer))
    46  	}
    47  	nodeInfos := make([]model.NodeInfo, 0, len(uniqueNodes))
    48  	for _, nodeInfo := range uniqueNodes {
    49  		nodeInfos = append(nodeInfos, nodeInfo)
    50  	}
    51  	return nodeInfos, nil
    52  }
    53  
    54  // compile-time interface assertions
    55  var _ requester.NodeDiscoverer = (*Chain)(nil)