mirror of
https://github.com/juanfont/headscale.git
synced 2025-08-05 13:49:57 +02:00
Only read relevant nodes from database in PeerChangedResponse
This commit is contained in:
parent
b5953d689c
commit
af04eb5ffd
@ -87,6 +87,7 @@ The new policy can be used by setting the environment variable
|
|||||||
[#2493](https://github.com/juanfont/headscale/pull/2493)
|
[#2493](https://github.com/juanfont/headscale/pull/2493)
|
||||||
- If a OIDC provider doesn't include the `email_verified` claim in its ID
|
- 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.
|
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)
|
## 0.25.1 (2025-02-25)
|
||||||
|
|
||||||
|
@ -3,7 +3,9 @@ package mapper
|
|||||||
import (
|
import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"gorm.io/gorm"
|
||||||
"io/fs"
|
"io/fs"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
@ -257,11 +259,6 @@ func (m *Mapper) PeerChangedResponse(
|
|||||||
) ([]byte, error) {
|
) ([]byte, error) {
|
||||||
resp := m.baseMapResponse()
|
resp := m.baseMapResponse()
|
||||||
|
|
||||||
peers, err := m.ListPeers(node.ID)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var removedIDs []tailcfg.NodeID
|
var removedIDs []tailcfg.NodeID
|
||||||
var changedIDs []types.NodeID
|
var changedIDs []types.NodeID
|
||||||
for nodeID, nodeChanged := range changed {
|
for nodeID, nodeChanged := range changed {
|
||||||
@ -273,13 +270,21 @@ func (m *Mapper) PeerChangedResponse(
|
|||||||
}
|
}
|
||||||
|
|
||||||
changedNodes := make(types.Nodes, 0, len(changedIDs))
|
changedNodes := make(types.Nodes, 0, len(changedIDs))
|
||||||
for _, peer := range peers {
|
for _, changedID := range changedIDs {
|
||||||
if slices.Contains(changedIDs, peer.ID) {
|
if changedID != node.ID {
|
||||||
changedNodes = append(changedNodes, peer)
|
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,
|
&resp,
|
||||||
false, // partial change
|
false, // partial change
|
||||||
m.polMan,
|
m.polMan,
|
||||||
@ -496,6 +501,17 @@ func (m *Mapper) ListPeers(nodeID types.NodeID) (types.Nodes, error) {
|
|||||||
return peers, nil
|
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 {
|
func nodeMapToList(nodes map[uint64]*types.Node) types.Nodes {
|
||||||
ret := make(types.Nodes, 0)
|
ret := make(types.Nodes, 0)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user