From 9c35528fced1aff72b48ff63aaa17495ad06668b Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Mon, 3 Sep 2018 17:16:56 -0700 Subject: [PATCH] server: attempt reconnection to all known addresses --- server.go | 60 +++++++++++++++++++------------------------------------ 1 file changed, 21 insertions(+), 39 deletions(-) diff --git a/server.go b/server.go index 9bd996f5a..f633db535 100644 --- a/server.go +++ b/server.go @@ -1597,52 +1597,34 @@ func (s *server) establishPersistentConnections() error { pubStr := string(policy.Node.PubKeyBytes[:]) - // Add addresses from channel graph/NodeAnnouncements to the - // list of addresses we'll connect to. If there are duplicates - // that have different ports specified, the port from the - // channel graph should supersede the port from the link node. - var addrs []net.Addr + // Add all unique addresses from channel graph/NodeAnnouncements + // to the list of addresses we'll connect to for this peer. + var addrSet = make(map[string]net.Addr) + for _, addr := range policy.Node.Addresses { + switch addr.(type) { + case *net.TCPAddr, *tor.OnionAddr: + addrSet[addr.String()] = addr + } + } + + // If this peer is also recorded as a link node, we'll add any + // additional addresses that have not already been selected. linkNodeAddrs, ok := nodeAddrsMap[pubStr] if ok { for _, lnAddress := range linkNodeAddrs.addresses { - var addrHost string - switch addr := lnAddress.(type) { - case *net.TCPAddr: - addrHost = addr.IP.String() - case *tor.OnionAddr: - addrHost = addr.OnionService - default: - continue - } - - var addrMatched bool - for _, polAddress := range policy.Node.Addresses { - switch addr := polAddress.(type) { - case *net.TCPAddr: - if addr.IP.String() == addrHost { - addrMatched = true - addrs = append(addrs, addr) - } - case *tor.OnionAddr: - if addr.OnionService == addrHost { - addrMatched = true - addrs = append(addrs, addr) - } - } - } - if !addrMatched { - addrs = append(addrs, lnAddress) - } - } - } else { - for _, addr := range policy.Node.Addresses { - switch addr.(type) { + switch lnAddress.(type) { case *net.TCPAddr, *tor.OnionAddr: - addrs = append(addrs, addr) + addrSet[lnAddress.String()] = lnAddress } } } + // Construct a slice of the deduped addresses. + var addrs []net.Addr + for _, addr := range addrSet { + addrs = append(addrs, addr) + } + n := &nodeAddresses{ addresses: addrs, } @@ -2356,7 +2338,7 @@ func (s *server) peerInitializer(p *peer) { // Start teh peer! If an error occurs, we Disconnect the peer, which // will unblock the peerTerminationWatcher. if err := p.Start(); err != nil { - p.Disconnect(errors.New("unable to start peer: %v")) + p.Disconnect(fmt.Errorf("unable to start peer: %v", err)) return }