OSDN Git Service

Add dial address filter function
authorYahtoo Ma <yahtoo.ma@gmail.com>
Tue, 17 Apr 2018 13:21:58 +0000 (21:21 +0800)
committerYahtoo Ma <yahtoo.ma@gmail.com>
Thu, 19 Apr 2018 02:01:22 +0000 (10:01 +0800)
p2p/addrbook.go
p2p/pex_reactor.go
p2p/switch.go

index 5339d64..35a04c3 100644 (file)
@@ -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
        }
 
index d42276f..aa720dd 100644 (file)
@@ -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)
                }
        }
 
index f0acfec..022df9d 100644 (file)
@@ -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
 }