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

     1  package ranking
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/filecoin-project/bacalhau/pkg/compute/capacity"
     7  	"github.com/filecoin-project/bacalhau/pkg/model"
     8  	"github.com/filecoin-project/bacalhau/pkg/requester"
     9  	"github.com/rs/zerolog/log"
    10  )
    11  
    12  type MaxUsageNodeRanker struct {
    13  }
    14  
    15  func NewMaxUsageNodeRanker() *MaxUsageNodeRanker {
    16  	return &MaxUsageNodeRanker{}
    17  }
    18  
    19  // RankNodes ranks nodes based on the MaxJobRequirements the compute nodes are accepting:
    20  // - Rank 10: Node is accepting MaxJobRequirements that are equal or higher than the job requirements.
    21  // - Rank -1: Node is accepting MaxJobRequirements that are lower than the job requirements.
    22  // - Rank 0: Node MaxJobRequirements are not set, or the node was discovered not through nodeInfoPublisher (e.g. identity protocol)
    23  func (s *MaxUsageNodeRanker) RankNodes(ctx context.Context, job model.Job, nodes []model.NodeInfo) ([]requester.NodeRank, error) {
    24  	ranks := make([]requester.NodeRank, len(nodes))
    25  	jobResourceUsage := capacity.ParseResourceUsageConfig(job.Spec.Resources)
    26  	jobResourceUsageSet := !jobResourceUsage.IsZero()
    27  	for i, node := range nodes {
    28  		rank := 0
    29  		if jobResourceUsageSet {
    30  			if jobResourceUsage.LessThanEq(node.ComputeNodeInfo.MaxJobRequirements) {
    31  				rank = 10
    32  			} else {
    33  				log.Ctx(ctx).Trace().Msgf("filtering node %s doesn't accept MaxJobRequirements %s", node.PeerInfo.ID, jobResourceUsage)
    34  				rank = -1
    35  			}
    36  		}
    37  		ranks[i] = requester.NodeRank{
    38  			NodeInfo: node,
    39  			Rank:     rank,
    40  		}
    41  	}
    42  	return ranks, nil
    43  }