| 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 |
| } |