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 }