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 }