forked from TrueCloudLab/neoneo-go
Merge pull request #1861 from nspcc-dev/fix-too-many-connections-attempted
Fix too many connections attempted
This commit is contained in:
commit
67a01f4719
2 changed files with 14 additions and 6 deletions
|
@ -45,6 +45,7 @@ type DefaultDiscovery struct {
|
|||
connectedAddrs map[string]bool
|
||||
goodAddrs map[string]capability.Capabilities
|
||||
unconnectedAddrs map[string]int
|
||||
attempted map[string]bool
|
||||
isDead bool
|
||||
requestCh chan int
|
||||
pool chan string
|
||||
|
@ -60,6 +61,7 @@ func NewDefaultDiscovery(addrs []string, dt time.Duration, ts Transporter) *Defa
|
|||
connectedAddrs: make(map[string]bool),
|
||||
goodAddrs: make(map[string]capability.Capabilities),
|
||||
unconnectedAddrs: make(map[string]int),
|
||||
attempted: make(map[string]bool),
|
||||
requestCh: make(chan int),
|
||||
pool: make(chan string, maxPoolSize),
|
||||
}
|
||||
|
@ -189,7 +191,11 @@ func (d *DefaultDiscovery) RegisterConnectedAddr(addr string) {
|
|||
}
|
||||
|
||||
func (d *DefaultDiscovery) tryAddress(addr string) {
|
||||
if err := d.transport.Dial(addr, d.dialTimeout); err != nil {
|
||||
err := d.transport.Dial(addr, d.dialTimeout)
|
||||
d.lock.Lock()
|
||||
delete(d.attempted, addr)
|
||||
d.lock.Unlock()
|
||||
if err != nil {
|
||||
d.RegisterBadAddr(addr)
|
||||
d.RequestRemote(1)
|
||||
}
|
||||
|
@ -225,14 +231,14 @@ func (d *DefaultDiscovery) run() {
|
|||
requested = r
|
||||
}
|
||||
case addr := <-d.pool:
|
||||
d.lock.RLock()
|
||||
addrIsConnected := d.connectedAddrs[addr]
|
||||
d.lock.RUnlock()
|
||||
updatePoolCountMetric(d.PoolCount())
|
||||
if !addrIsConnected {
|
||||
d.lock.Lock()
|
||||
if !d.connectedAddrs[addr] && !d.attempted[addr] {
|
||||
d.attempted[addr] = true
|
||||
go d.tryAddress(addr)
|
||||
requested--
|
||||
}
|
||||
d.lock.Unlock()
|
||||
default: // Empty pool
|
||||
var added int
|
||||
d.lock.Lock()
|
||||
|
|
|
@ -916,9 +916,11 @@ func (s *Server) handleAddrCmd(p Peer, addrs *payload.AddressList) error {
|
|||
if !p.CanProcessAddr() {
|
||||
return errors.New("unexpected addr received")
|
||||
}
|
||||
dups := make(map[string]bool)
|
||||
for _, a := range addrs.Addrs {
|
||||
addr, err := a.GetTCPAddress()
|
||||
if err == nil {
|
||||
if err == nil && !dups[addr] {
|
||||
dups[addr] = true
|
||||
s.discovery.BackFill(addr)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue