mirror of
https://github.com/XRPLF/clio.git
synced 2025-11-20 11:45:53 +00:00
100 lines
1.8 KiB
Go
100 lines
1.8 KiB
Go
package util
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"fmt"
|
|
"log"
|
|
"math"
|
|
"math/big"
|
|
|
|
"github.com/gocql/gocql"
|
|
)
|
|
|
|
type TokenRange struct {
|
|
StartRange int64
|
|
EndRange int64
|
|
}
|
|
|
|
// not stored as arrays of startRange/endRange because it will be O(n) lookup
|
|
// stored as Map with key startRange, value endRange so O(1) lookup for tokenRange
|
|
type StoredRange struct {
|
|
TokenRange map[int64]int64 // all ranges that has been read and deleted
|
|
}
|
|
|
|
func Shuffle(data []*TokenRange) {
|
|
for i := 1; i < len(data); i++ {
|
|
rBig, _ := rand.Int(rand.Reader, big.NewInt(int64(i+1)))
|
|
r := int(rBig.Int64())
|
|
if i != r {
|
|
data[r], data[i] = data[i], data[r]
|
|
}
|
|
}
|
|
}
|
|
|
|
func PromptContinue() bool {
|
|
var continueFlag string
|
|
|
|
log.Println("Are you sure you want to continue? (y/n)")
|
|
if fmt.Scanln(&continueFlag); continueFlag != "y" {
|
|
return false
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
func GetTokenRanges(workerCount int) []*TokenRange {
|
|
var n = workerCount
|
|
var m = int64(n * 100)
|
|
var maxSize uint64 = math.MaxInt64 * 2
|
|
var rangeSize = maxSize / uint64(m)
|
|
|
|
var start int64 = math.MinInt64
|
|
var end int64
|
|
var shouldBreak = false
|
|
|
|
var ranges = make([]*TokenRange, m)
|
|
|
|
for i := int64(0); i < m; i++ {
|
|
end = start + int64(rangeSize)
|
|
if start > 0 && end < 0 {
|
|
end = math.MaxInt64
|
|
shouldBreak = true
|
|
}
|
|
|
|
ranges[i] = &TokenRange{StartRange: start, EndRange: end}
|
|
|
|
if shouldBreak {
|
|
break
|
|
}
|
|
|
|
start = end + 1
|
|
}
|
|
|
|
return ranges
|
|
}
|
|
|
|
func GetConsistencyLevel(consistencyValue string) gocql.Consistency {
|
|
switch consistencyValue {
|
|
case "any":
|
|
return gocql.Any
|
|
case "one":
|
|
return gocql.One
|
|
case "two":
|
|
return gocql.Two
|
|
case "three":
|
|
return gocql.Three
|
|
case "quorum":
|
|
return gocql.Quorum
|
|
case "all":
|
|
return gocql.All
|
|
case "localquorum":
|
|
return gocql.LocalQuorum
|
|
case "eachquorum":
|
|
return gocql.EachQuorum
|
|
case "localone":
|
|
return gocql.LocalOne
|
|
default:
|
|
return gocql.One
|
|
}
|
|
}
|