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

     1  package ranking
     2  
     3  import (
     4  	"context"
     5  	"crypto/rand"
     6  	"fmt"
     7  	"math/big"
     8  
     9  	"github.com/filecoin-project/bacalhau/pkg/model"
    10  	"github.com/filecoin-project/bacalhau/pkg/requester"
    11  )
    12  
    13  type RandomNodeRankerParams struct {
    14  	RandomnessRange int
    15  }
    16  
    17  // RandomNodeRanker assigns a random rank to each node to allow the requester to select random top nodes
    18  // for job execution.
    19  type RandomNodeRanker struct {
    20  	randomnessRange *big.Int
    21  }
    22  
    23  func NewRandomNodeRanker(params RandomNodeRankerParams) *RandomNodeRanker {
    24  	if params.RandomnessRange <= 0 {
    25  		panic(fmt.Sprintf("randomness range must be >= 0: %d", params.RandomnessRange))
    26  	}
    27  	return &RandomNodeRanker{
    28  		randomnessRange: big.NewInt(int64(params.RandomnessRange)),
    29  	}
    30  }
    31  
    32  func (s *RandomNodeRanker) RankNodes(ctx context.Context, job model.Job, nodes []model.NodeInfo) ([]requester.NodeRank, error) {
    33  	ranks := make([]requester.NodeRank, len(nodes))
    34  	for i, node := range nodes {
    35  		rank, err := s.getRandomRank()
    36  		if err != nil {
    37  			return nil, err
    38  		}
    39  		ranks[i] = requester.NodeRank{
    40  			NodeInfo: node,
    41  			Rank:     rank,
    42  		}
    43  	}
    44  	return ranks, nil
    45  }
    46  
    47  func (s *RandomNodeRanker) getRandomRank() (int, error) {
    48  	nBig, err := rand.Int(rand.Reader, s.randomnessRange)
    49  	if err != nil {
    50  		return 0, err
    51  	}
    52  	return int(nBig.Int64()), nil
    53  }