blob: a0d9a0d38131b19d50b875e39ed2d3393c9140c8 [file] [log] [blame]
package main
import (
"errors"
"flag"
"io/ioutil"
"log"
"strings"
)
func main() {
if err := xmain(); err != nil {
log.Fatalf("fatal error: %v", err)
}
}
func xmain() error {
workerService := flag.String("worker-service", "", "Name of worker service")
chunks := flag.Int("chunks", 0, "Number of chunks")
input := flag.String("input", "", "Path to input file")
randSeed := flag.Int64("rand-seed", int64(0), "Random seed")
shuffle := flag.Bool("shuffle", false, "Shuffle the input so as to mitigate makespan nonuniformity")
flag.Parse()
if *workerService == "" {
return errors.New("worker-service unset")
}
if *chunks == 0 {
return errors.New("chunks unset")
}
if *input == "" {
return errors.New("input unset")
}
tests, err := loadTests(*input)
if err != nil {
return err
}
testChunks := chunkTests(tests, *chunks, *shuffle, *randSeed)
log.Printf("Loaded %d tests (%d chunks)", len(tests), len(testChunks))
return executeTests(*workerService, testChunks)
}
func chunkTests(tests []string, numChunks int, shuffle bool, randSeed int64) [][]string {
// shuffling (experimental) mitigates makespan nonuniformity
// Not sure this can cause some locality problem..
if shuffle {
shuffleStrings(tests, randSeed)
}
return chunkStrings(tests, numChunks)
}
func loadTests(filename string) ([]string, error) {
b, err := ioutil.ReadFile(filename)
if err != nil {
return nil, err
}
var tests []string
for _, line := range strings.Split(string(b), "\n") {
s := strings.TrimSpace(line)
if s != "" {
tests = append(tests, s)
}
}
return tests, nil
}