package main // // same as crash.go but doesn't actually crash. // // go build -buildmode=plugin nocrash.go // import "6.5840/mr" import crand "crypto/rand" import "math/big" import "strings" import "os" import "sort" import "strconv" func maybeCrash() { max := big.NewInt(1000) rr, _ := crand.Int(crand.Reader, max) if false && rr.Int64() < 500 { // crash! os.Exit(1) } } func Map(filename string, contents string) []mr.KeyValue { maybeCrash() kva := []mr.KeyValue{} kva = append(kva, mr.KeyValue{"a", filename}) kva = append(kva, mr.KeyValue{"b", strconv.Itoa(len(filename))}) kva = append(kva, mr.KeyValue{"c", strconv.Itoa(len(contents))}) kva = append(kva, mr.KeyValue{"d", "xyzzy"}) return kva } func Reduce(key string, values []string) string { maybeCrash() // sort values to ensure deterministic output. vv := make([]string, len(values)) copy(vv, values) sort.Strings(vv) val := strings.Join(vv, " ") return val }