From 7f469714ed68210342e7dfd0f764ff5af6b73790 Mon Sep 17 00:00:00 2001 From: Kristoffer Dalby Date: Mon, 15 Sep 2025 12:04:10 +0200 Subject: [PATCH] mapper: send selfupdate on NewOrUpdate change Signed-off-by: Kristoffer Dalby --- hscontrol/mapper/batcher.go | 10 ++++++++-- hscontrol/types/change/change.go | 5 +++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/hscontrol/mapper/batcher.go b/hscontrol/mapper/batcher.go index 7f71676d..3a883e2f 100644 --- a/hscontrol/mapper/batcher.go +++ b/hscontrol/mapper/batcher.go @@ -108,7 +108,13 @@ func generateMapResponse(nodeID types.NodeID, version tailcfg.CapabilityVersion, } case change.NodeNewOrUpdate: - mapResp, err = mapper.peerChangeResponse(nodeID, version, c.NodeID) + // If the node is the one being updated, we send a "full" self update + // to ensure the node sees changes to its own properties (e.g., hostname/DNS name changes) + if c.IsSelfUpdate(nodeID) { + mapResp, err = mapper.selfMapResponse(nodeID, version) + } else { + mapResp, err = mapper.peerChangeResponse(nodeID, version, c.NodeID) + } case change.NodeRemove: mapResp, err = mapper.peerRemovedResponse(nodeID, c.NodeID) @@ -116,7 +122,7 @@ func generateMapResponse(nodeID types.NodeID, version tailcfg.CapabilityVersion, case change.NodeKeyExpiry: // If the node is the one whose key is expiring, we send a "full" self update // as nodes will ignore patch updates about themselves (?). - if nodeID == c.NodeID { + if c.IsSelfUpdate(nodeID) { mapResp, err = mapper.selfMapResponse(nodeID, version) // mapResp, err = mapper.fullMapResponse(nodeID, version) } else { diff --git a/hscontrol/types/change/change.go b/hscontrol/types/change/change.go index aac8acd6..36cf8a4f 100644 --- a/hscontrol/types/change/change.go +++ b/hscontrol/types/change/change.go @@ -130,6 +130,11 @@ func RemoveUpdatesForSelf(id types.NodeID, cs []ChangeSet) (ret []ChangeSet) { return ret } +// IsSelfUpdate reports whether this ChangeSet represents an update to the given node itself. +func (c ChangeSet) IsSelfUpdate(nodeID types.NodeID) bool { + return c.NodeID == nodeID +} + func (c ChangeSet) AlsoSelf() bool { // If NodeID is 0, it means this ChangeSet is not related to a specific node, // so we consider it as a change that should be sent to all nodes.