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)