func pickupAddrs(addrs []string, n int, connDuration lrucache.Cache, connError lrucache.Cache) []string { if len(addrs) <= n { return addrs } goodAddrs := make([]racer, 0) unknownAddrs := make([]string, 0) badAddrs := make([]string, 0) for _, addr := range addrs { if d, ok := connDuration.GetQuiet(addr); ok { if d1, ok := d.(time.Duration); !ok { glog.Errorf("%#v for %#v is not a time.Duration", d, addr) } else { goodAddrs = append(goodAddrs, racer{addr, d1}) } } else if e, ok := connError.GetQuiet(addr); ok { if _, ok := e.(error); !ok { glog.Errorf("%#v for %#v is not a error", e, addr) } else { badAddrs = append(badAddrs, addr) } } else { unknownAddrs = append(unknownAddrs, addr) } } addrs1 := make([]string, 0, n) sort.Sort(racers(goodAddrs)) if len(goodAddrs) > n/2 { goodAddrs = goodAddrs[:n/2] } for _, r := range goodAddrs { addrs1 = append(addrs1, r.addr) } for _, addrs2 := range [][]string{unknownAddrs, badAddrs} { if len(addrs1) < n && len(addrs2) > 0 { m := n - len(addrs1) if len(addrs2) > m { helpers.ShuffleStringsN(addrs2, m) addrs2 = addrs2[:m] } addrs1 = append(addrs1, addrs2...) } } return addrs1 }
func pickupAddrs(addrs []string, n int, duration lrucache.Cache) []string { if len(addrs) <= n { return addrs } goodAddrs := make([]racer, 0) unknownAddrs := make([]string, 0) for _, addr := range addrs { d, ok := duration.GetQuiet(addr) if ok { d1, ok := d.(time.Duration) if !ok { glog.Errorf("%#v for %#v is not a time.Duration", d, addr) } else { goodAddrs = append(goodAddrs, racer{addr, d1}) } } else { unknownAddrs = append(unknownAddrs, addr) } } sort.Sort(racers(goodAddrs)) if len(goodAddrs) > n/2 { goodAddrs = goodAddrs[:n/2] } goodAddrs1 := make([]string, len(goodAddrs), n) for i, r := range goodAddrs { goodAddrs1[i] = r.addr } shuffle(unknownAddrs) if len(goodAddrs1)+len(unknownAddrs) > n { unknownAddrs = unknownAddrs[:n-len(goodAddrs1)] } return append(goodAddrs1, unknownAddrs...) }