mirror of
https://github.com/juanfont/headscale.git
synced 2025-11-27 12:43:39 -05:00
batcher: send endpoint and derp only updates. (#2856)
This commit is contained in:
@@ -34,6 +34,8 @@ const (
|
||||
NodeRemove Change = 23
|
||||
NodeKeyExpiry Change = 24
|
||||
NodeNewOrUpdate Change = 25
|
||||
NodeEndpoint Change = 26
|
||||
NodeDERP Change = 27
|
||||
|
||||
// User changes.
|
||||
UserNewOrUpdate Change = 51
|
||||
@@ -174,17 +176,19 @@ func NodeRemoved(id types.NodeID) ChangeSet {
|
||||
}
|
||||
}
|
||||
|
||||
func NodeOnline(id types.NodeID) ChangeSet {
|
||||
func NodeOnline(node types.NodeView) ChangeSet {
|
||||
return ChangeSet{
|
||||
Change: NodeCameOnline,
|
||||
NodeID: id,
|
||||
Change: NodeCameOnline,
|
||||
NodeID: node.ID(),
|
||||
IsSubnetRouter: node.IsSubnetRouter(),
|
||||
}
|
||||
}
|
||||
|
||||
func NodeOffline(id types.NodeID) ChangeSet {
|
||||
func NodeOffline(node types.NodeView) ChangeSet {
|
||||
return ChangeSet{
|
||||
Change: NodeWentOffline,
|
||||
NodeID: id,
|
||||
Change: NodeWentOffline,
|
||||
NodeID: node.ID(),
|
||||
IsSubnetRouter: node.IsSubnetRouter(),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -196,6 +200,20 @@ func KeyExpiry(id types.NodeID, expiry time.Time) ChangeSet {
|
||||
}
|
||||
}
|
||||
|
||||
func EndpointUpdate(id types.NodeID) ChangeSet {
|
||||
return ChangeSet{
|
||||
Change: NodeEndpoint,
|
||||
NodeID: id,
|
||||
}
|
||||
}
|
||||
|
||||
func DERPUpdate(id types.NodeID) ChangeSet {
|
||||
return ChangeSet{
|
||||
Change: NodeDERP,
|
||||
NodeID: id,
|
||||
}
|
||||
}
|
||||
|
||||
func UserAdded(id types.UserID) ChangeSet {
|
||||
return ChangeSet{
|
||||
Change: UserNewOrUpdate,
|
||||
|
||||
@@ -18,6 +18,8 @@ func _() {
|
||||
_ = x[NodeRemove-23]
|
||||
_ = x[NodeKeyExpiry-24]
|
||||
_ = x[NodeNewOrUpdate-25]
|
||||
_ = x[NodeEndpoint-26]
|
||||
_ = x[NodeDERP-27]
|
||||
_ = x[UserNewOrUpdate-51]
|
||||
_ = x[UserRemove-52]
|
||||
}
|
||||
@@ -26,13 +28,13 @@ const (
|
||||
_Change_name_0 = "ChangeUnknown"
|
||||
_Change_name_1 = "Full"
|
||||
_Change_name_2 = "PolicyDERPExtraRecords"
|
||||
_Change_name_3 = "NodeCameOnlineNodeWentOfflineNodeRemoveNodeKeyExpiryNodeNewOrUpdate"
|
||||
_Change_name_3 = "NodeCameOnlineNodeWentOfflineNodeRemoveNodeKeyExpiryNodeNewOrUpdateNodeEndpointNodeDERP"
|
||||
_Change_name_4 = "UserNewOrUpdateUserRemove"
|
||||
)
|
||||
|
||||
var (
|
||||
_Change_index_2 = [...]uint8{0, 6, 10, 22}
|
||||
_Change_index_3 = [...]uint8{0, 14, 29, 39, 52, 67}
|
||||
_Change_index_3 = [...]uint8{0, 14, 29, 39, 52, 67, 79, 87}
|
||||
_Change_index_4 = [...]uint8{0, 15, 25}
|
||||
)
|
||||
|
||||
@@ -45,7 +47,7 @@ func (i Change) String() string {
|
||||
case 11 <= i && i <= 13:
|
||||
i -= 11
|
||||
return _Change_name_2[_Change_index_2[i]:_Change_index_2[i+1]]
|
||||
case 21 <= i && i <= 25:
|
||||
case 21 <= i && i <= 27:
|
||||
i -= 21
|
||||
return _Change_name_3[_Change_index_3[i]:_Change_index_3[i+1]]
|
||||
case 51 <= i && i <= 52:
|
||||
|
||||
@@ -535,8 +535,10 @@ func (node *Node) PeerChangeFromMapRequest(req tailcfg.MapRequest) tailcfg.PeerC
|
||||
}
|
||||
}
|
||||
|
||||
// TODO(kradalby): Find a good way to compare updates
|
||||
ret.Endpoints = req.Endpoints
|
||||
// Compare endpoints using order-independent comparison
|
||||
if EndpointsChanged(node.Endpoints, req.Endpoints) {
|
||||
ret.Endpoints = req.Endpoints
|
||||
}
|
||||
|
||||
now := time.Now()
|
||||
ret.LastSeen = &now
|
||||
@@ -544,6 +546,32 @@ func (node *Node) PeerChangeFromMapRequest(req tailcfg.MapRequest) tailcfg.PeerC
|
||||
return ret
|
||||
}
|
||||
|
||||
// EndpointsChanged compares two endpoint slices and returns true if they differ.
|
||||
// The comparison is order-independent - endpoints are sorted before comparison.
|
||||
func EndpointsChanged(oldEndpoints, newEndpoints []netip.AddrPort) bool {
|
||||
if len(oldEndpoints) != len(newEndpoints) {
|
||||
return true
|
||||
}
|
||||
|
||||
if len(oldEndpoints) == 0 {
|
||||
return false
|
||||
}
|
||||
|
||||
// Make copies to avoid modifying the original slices
|
||||
oldCopy := slices.Clone(oldEndpoints)
|
||||
newCopy := slices.Clone(newEndpoints)
|
||||
|
||||
// Sort both slices to enable order-independent comparison
|
||||
slices.SortFunc(oldCopy, func(a, b netip.AddrPort) int {
|
||||
return a.Compare(b)
|
||||
})
|
||||
slices.SortFunc(newCopy, func(a, b netip.AddrPort) int {
|
||||
return a.Compare(b)
|
||||
})
|
||||
|
||||
return !slices.Equal(oldCopy, newCopy)
|
||||
}
|
||||
|
||||
func (node *Node) RegisterMethodToV1Enum() v1.RegisterMethod {
|
||||
switch node.RegisterMethod {
|
||||
case "authkey":
|
||||
|
||||
Reference in New Issue
Block a user