//NodesForGet returns nodes which has datfile cache , and that extends nodes to #searchDepth . func NodesForGet(datfile string, searchDepth int) node.Slice { var ns, ns2 node.Slice ns = ns.Extend(Get(datfile, nil)) ns = ns.Extend(Get(list, nil)) ns = ns.Extend(Random(ns, 0)) for _, n := range ns { if !n.Equals(node.Me(true)) && n.IsAllowed() { ns2 = append(ns2, n) } } if ns2.Len() > searchDepth { ns2 = ns2[:searchDepth] } return ns2 }
//Random selects # of min(all # of nodes,n) nodes randomly except exclude nodes. func Random(exclude node.Slice, num int) []*node.Node { all := getAllNodes() if exclude != nil { cand := make([]*node.Node, 0, len(all)) m := exclude.ToMap() for _, n := range all { if _, exist := m[n.Nodestr]; !exist { cand = append(cand, n) } } all = cand } n := all.Len() if num < n && num != 0 { n = num } r := make([]*node.Node, n) rs := rand.Perm(all.Len()) for i := 0; i < n; i++ { r[i] = all[rs[i]] } return r }