if (newCorrelation+oldCorrelation)*a.rand.Float64() < oldCorrelation {
// pick random Old bucket.
var bucket map[string]*knownAddress = nil
- for len(bucket) == 0 {
+ num := 0
+ for len(bucket) == 0 && num < oldBucketCount {
bucket = a.addrOld[a.rand.Intn(len(a.addrOld))]
+ num++
+ }
+ if num == oldBucketCount {
+ return nil
}
// pick a random ka from bucket.
randIndex := a.rand.Intn(len(bucket))
} else {
// pick random New bucket.
var bucket map[string]*knownAddress = nil
- for len(bucket) == 0 {
+ num := 0
+ for len(bucket) == 0 && num < newBucketCount {
bucket = a.addrNew[a.rand.Intn(len(a.addrNew))]
+ num++
+ }
+ if num == newBucketCount {
+ return nil
}
// pick a random ka from bucket.
randIndex := a.rand.Intn(len(bucket))
*/
func (ka *knownAddress) isBad() bool {
// Has been attempted in the last minute --> good
- if ka.LastAttempt.Before(time.Now().Add(-1 * time.Minute)) {
- return false
+ if ka.LastAttempt.After(time.Now().Add(-1 * time.Minute)) {
+ return true
}
// Over a month old?
- if ka.LastAttempt.After(time.Now().Add(-1 * numMissingDays * time.Hour * 24)) {
+ if ka.LastAttempt.Before(time.Now().Add(-1 * numMissingDays * time.Hour * 24)) {
return true
}
if try == nil {
break
}
+ ka := r.book.addrLookup[try.String()]
+ if ka != nil {
+ if ka.isBad() {
+ log.Info("Pick invalid address.")
+ continue
+ }
+ }
_, alreadySelected := toDial[try.IP.String()]
alreadyDialing := r.Switch.IsDialing(try)
var alreadyConnected bool
for _, item := range toDial {
if _, err := r.Switch.DialPeerWithAddress(item, false); err != nil {
r.book.MarkAttempt(item)
+ } else {
+ r.book.MarkGood(item)
}
}
}
addrBook.AddAddress(netAddr, ourAddr)
}
+
addrBook.Save()
}
// permute the list, dial them in random order.
- perm := rand.Perm(len(netAddrs))
- for i := 0; i < len(perm); i++ {
- j := perm[i]
- sw.dialSeed(netAddrs[j])
- }
+ //perm := rand.Perm(len(netAddrs))
+ //for i := 0; i < len(perm); i++ {
+ // j := perm[i]
+ // sw.dialSeed(netAddrs[j])
+ //}
return nil
}