From: Yahtoo Ma Date: Tue, 17 Apr 2018 13:21:58 +0000 (+0800) Subject: Add dial address filter function X-Git-Tag: v1.0.5-alpha~291^2 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=3d12176431a0cfb39900adb80a3925691d544563;p=bytom%2Fbytom-spv.git Add dial address filter function --- diff --git a/p2p/addrbook.go b/p2p/addrbook.go index 5339d64a..35a04c3e 100644 --- a/p2p/addrbook.go +++ b/p2p/addrbook.go @@ -208,8 +208,13 @@ func (a *AddrBook) PickAddress(newBias int) *NetAddress { 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)) @@ -223,8 +228,13 @@ func (a *AddrBook) PickAddress(newBias int) *NetAddress { } 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)) @@ -825,12 +835,12 @@ func (ka *knownAddress) removeBucketRef(bucketIdx int) int { */ 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 } diff --git a/p2p/pex_reactor.go b/p2p/pex_reactor.go index d42276fe..aa720dd1 100644 --- a/p2p/pex_reactor.go +++ b/p2p/pex_reactor.go @@ -266,6 +266,13 @@ func (r *PEXReactor) ensurePeers() { 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 @@ -294,6 +301,8 @@ func (r *PEXReactor) ensurePeers() { for _, item := range toDial { if _, err := r.Switch.DialPeerWithAddress(item, false); err != nil { r.book.MarkAttempt(item) + } else { + r.book.MarkGood(item) } } diff --git a/p2p/switch.go b/p2p/switch.go index f0acfec8..022df9dc 100644 --- a/p2p/switch.go +++ b/p2p/switch.go @@ -328,15 +328,16 @@ func (sw *Switch) DialSeeds(addrBook *AddrBook, seeds []string) error { } 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 }