Merge pull request #1836 from cfromknecht/reconnect-to-all-known-addrs

server: Reconnect to all known addrs for persistent peers
This commit is contained in:
Olaoluwa Osuntokun 2018-09-04 19:44:35 -07:00 committed by GitHub
commit 7435fba78b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -4,7 +4,6 @@ import (
"bytes" "bytes"
"context" "context"
"crypto/rand" "crypto/rand"
"crypto/sha256"
"encoding/hex" "encoding/hex"
"fmt" "fmt"
"image/color" "image/color"
@ -87,10 +86,6 @@ type server struct {
// that's backed by the identity private key of the running lnd node. // that's backed by the identity private key of the running lnd node.
nodeSigner *nodeSigner nodeSigner *nodeSigner
// lightningID is the sha256 of the public key corresponding to our
// long-term identity private key.
lightningID [32]byte
// listenAddrs is the list of addresses the server is currently // listenAddrs is the list of addresses the server is currently
// listening on. // listening on.
listenAddrs []net.Addr listenAddrs []net.Addr
@ -273,7 +268,6 @@ func newServer(listenAddrs []net.Addr, chanDB *channeldb.DB, cc *chainControl,
// TODO(roasbeef): derive proper onion key based on rotation // TODO(roasbeef): derive proper onion key based on rotation
// schedule // schedule
sphinx: htlcswitch.NewOnionProcessor(sphinxRouter), sphinx: htlcswitch.NewOnionProcessor(sphinxRouter),
lightningID: sha256.Sum256(serializedPubKey[:]),
persistentPeers: make(map[string]struct{}), persistentPeers: make(map[string]struct{}),
persistentPeersBackoff: make(map[string]time.Duration), persistentPeersBackoff: make(map[string]time.Duration),
@ -1603,51 +1597,33 @@ func (s *server) establishPersistentConnections() error {
pubStr := string(policy.Node.PubKeyBytes[:]) pubStr := string(policy.Node.PubKeyBytes[:])
// Add addresses from channel graph/NodeAnnouncements to the // Add all unique addresses from channel graph/NodeAnnouncements
// list of addresses we'll connect to. If there are duplicates // to the list of addresses we'll connect to for this peer.
// that have different ports specified, the port from the var addrSet = make(map[string]net.Addr)
// channel graph should supersede the port from the link node.
var addrs []net.Addr
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 { for _, addr := range policy.Node.Addresses {
switch addr.(type) { switch addr.(type) {
case *net.TCPAddr, *tor.OnionAddr: 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 {
switch lnAddress.(type) {
case *net.TCPAddr, *tor.OnionAddr:
addrSet[lnAddress.String()] = lnAddress
}
}
}
// Construct a slice of the deduped addresses.
var addrs []net.Addr
for _, addr := range addrSet {
addrs = append(addrs, addr) addrs = append(addrs, addr)
} }
}
}
n := &nodeAddresses{ n := &nodeAddresses{
addresses: addrs, addresses: addrs,
@ -2371,7 +2347,7 @@ func (s *server) peerInitializer(p *peer) {
// Start teh peer! If an error occurs, we Disconnect the peer, which // Start teh peer! If an error occurs, we Disconnect the peer, which
// will unblock the peerTerminationWatcher. // will unblock the peerTerminationWatcher.
if err := p.Start(); err != nil { 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 return
} }