fix: Don't clear out peers that haven't connected yet (#3916)

This was causing parallel connections to fail, because they wouldn't
be established yet.
This commit is contained in:
Kyle Carberry 2022-09-06 16:27:59 -05:00 committed by GitHub
parent 18af9426c0
commit dca24bd15d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 10 additions and 2 deletions

View File

@ -303,7 +303,9 @@ func (c *Conn) UpdateNodes(nodes []*Node) error {
for _, peer := range c.netMap.Peers {
if peerStatus, ok := status.Peer[peer.Key]; ok {
// Clear out inactive connections!
if !peerStatus.Active {
// If a connection hasn't been active for a minute post creation, we assume it's dead.
if !peerStatus.Active && peer.Created.Before(time.Now().Add(-time.Minute)) {
c.logger.Debug(context.Background(), "clearing peer", slog.F("peerStatus", peerStatus))
continue
}
}
@ -311,8 +313,9 @@ func (c *Conn) UpdateNodes(nodes []*Node) error {
}
for _, node := range nodes {
peerStatus, ok := status.Peer[node.Key]
peerMap[node.ID] = &tailcfg.Node{
peerNode := &tailcfg.Node{
ID: node.ID,
Created: time.Now(),
Key: node.Key,
DiscoKey: node.DiscoKey,
Addresses: node.Addresses,
@ -325,6 +328,11 @@ func (c *Conn) UpdateNodes(nodes []*Node) error {
// reason. TODO: @kylecarbs debug this!
KeepAlive: ok && peerStatus.Active,
}
existingNode, ok := peerMap[node.ID]
if ok {
peerNode.Created = existingNode.Created
}
peerMap[node.ID] = peerNode
}
c.netMap.Peers = make([]*tailcfg.Node, 0, len(peerMap))
for _, peer := range peerMap {