1
0
mirror of https://github.com/juanfont/headscale.git synced 2025-08-01 13:46:49 +02:00

Only read relevant nodes from database in PeerChangedResponse

This commit is contained in:
Nils Enkelmann 2025-03-28 11:20:44 +01:00
parent b5953d689c
commit af04eb5ffd
2 changed files with 26 additions and 9 deletions

View File

@ -87,6 +87,7 @@ The new policy can be used by setting the environment variable
[#2493](https://github.com/juanfont/headscale/pull/2493)
- If a OIDC provider doesn't include the `email_verified` claim in its ID
tokens, Headscale will attempt to get it from the UserInfo endpoint.
- Improve performance by only querying relevant nodes from the database for node updates
## 0.25.1 (2025-02-25)

View File

@ -3,7 +3,9 @@ package mapper
import (
"encoding/binary"
"encoding/json"
"errors"
"fmt"
"gorm.io/gorm"
"io/fs"
"net/url"
"os"
@ -257,11 +259,6 @@ func (m *Mapper) PeerChangedResponse(
) ([]byte, error) {
resp := m.baseMapResponse()
peers, err := m.ListPeers(node.ID)
if err != nil {
return nil, err
}
var removedIDs []tailcfg.NodeID
var changedIDs []types.NodeID
for nodeID, nodeChanged := range changed {
@ -273,13 +270,21 @@ func (m *Mapper) PeerChangedResponse(
}
changedNodes := make(types.Nodes, 0, len(changedIDs))
for _, peer := range peers {
if slices.Contains(changedIDs, peer.ID) {
changedNodes = append(changedNodes, peer)
for _, changedID := range changedIDs {
if changedID != node.ID {
changedNode, err := m.GetNode(changedID)
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
continue
} else {
return nil, err
}
}
changedNodes = append(changedNodes, changedNode)
}
}
err = appendPeerChanges(
err := appendPeerChanges(
&resp,
false, // partial change
m.polMan,
@ -496,6 +501,17 @@ func (m *Mapper) ListPeers(nodeID types.NodeID) (types.Nodes, error) {
return peers, nil
}
func (m *Mapper) GetNode(nodeID types.NodeID) (*types.Node, error) {
node, err := m.db.GetNodeByID(nodeID)
if err != nil {
return nil, err
}
online := m.notif.IsLikelyConnected(node.ID)
node.IsOnline = &online
return node, nil
}
func nodeMapToList(nodes map[uint64]*types.Node) types.Nodes {
ret := make(types.Nodes, 0)