all: apply godoc [Name] link conventions across comments
Every Go-identifier reference in // and /* */ comments now uses
godoc's [Name] linking syntax so pkg.go.dev and `go doc` render
them as clickable cross-references. No behaviour change.
Pattern applied across the tree:
In-package [Foo], [Foo.Bar]
Cross-package [pkg.Foo], [pkg.Foo.Bar]
Stdlib [netip.Prefix], [errors.Is], [context.Context]
Tailscale [tailcfg.MapResponse], [tailcfg.Node.CapMap],
[tailcfg.NodeAttrSuggestExitNode]
Skip rules:
- File:line refs left as plain text
- HuJSON wire keys inside backtick raw strings untouched
- ACL/policy syntax tokens (tag:foo, autogroup:self, ...) not Go
symbols, left as plain text
- JSON/OIDC wire keys, gorm tags, RFC IPv6 placeholders, markdown
link tags, decorative dividers — all left as-is
This commit is contained in:
parent
17236fd284
commit
4cca63155d
124 changed files with 1037 additions and 1011 deletions
|
|
@ -115,7 +115,7 @@ func (m *mapSession) serve() {
|
|||
// This is the mechanism where the node gives us information about its
|
||||
// current configuration.
|
||||
//
|
||||
// Process the MapRequest to update node state (endpoints, hostinfo, etc.)
|
||||
// Process the [tailcfg.MapRequest] to update node state (endpoints, hostinfo, etc.)
|
||||
c, err := m.h.state.UpdateNodeFromMapRequest(m.node.ID, m.req)
|
||||
if err != nil {
|
||||
httpError(m.w, err)
|
||||
|
|
@ -148,9 +148,9 @@ func (m *mapSession) serveLongPoll() {
|
|||
|
||||
m.log.Trace().Caller().Msg("long poll session started")
|
||||
|
||||
// connectGen is set by Connect() below and captured by the deferred cleanup closure.
|
||||
// It allows Disconnect() to reject stale calls from old sessions — if a newer session
|
||||
// has called Connect() (incrementing the generation), the old session's Disconnect()
|
||||
// connectGen is set by [state.State.Connect] below and captured by the deferred cleanup closure.
|
||||
// It allows [state.State.Disconnect] to reject stale calls from old sessions — if a newer session
|
||||
// has called [state.State.Connect] (incrementing the generation), the old session's [state.State.Disconnect]
|
||||
// sees a mismatched generation and becomes a no-op.
|
||||
var connectGen uint64
|
||||
|
||||
|
|
@ -169,7 +169,7 @@ func (m *mapSession) serveLongPoll() {
|
|||
|
||||
// When a node disconnects, it might rapidly reconnect (e.g. mobile clients, network weather).
|
||||
// Instead of immediately marking the node as offline, we wait a few seconds to see if it reconnects.
|
||||
// If it does reconnect, the existing mapSession will be replaced and the node remains online.
|
||||
// If it does reconnect, the existing [mapSession] will be replaced and the node remains online.
|
||||
// If it doesn't reconnect within the timeout, we mark it as offline.
|
||||
//
|
||||
// This avoids flapping nodes in the UI and unnecessary churn in the network.
|
||||
|
|
@ -190,8 +190,8 @@ func (m *mapSession) serveLongPoll() {
|
|||
}
|
||||
|
||||
if disconnected {
|
||||
// Pass the generation from our Connect() call. If a newer session has
|
||||
// connected since (bumping the generation), Disconnect() will detect
|
||||
// Pass the generation from our [state.State.Connect] call. If a newer session has
|
||||
// connected since (bumping the generation), [state.State.Disconnect] will detect
|
||||
// the mismatch and skip the state update, preventing the race where
|
||||
// an old grace period goroutine overwrites a newer session's online status.
|
||||
disconnectChanges, err := m.h.state.Disconnect(m.node.ID, connectGen)
|
||||
|
|
@ -214,12 +214,12 @@ func (m *mapSession) serveLongPoll() {
|
|||
|
||||
m.keepAliveTicker = time.NewTicker(m.keepAlive)
|
||||
|
||||
// Process the initial MapRequest to update node state (endpoints, hostinfo, etc.)
|
||||
// This must be done BEFORE calling Connect() to ensure routes are properly synchronized.
|
||||
// When nodes reconnect, they send their hostinfo with announced routes in the MapRequest.
|
||||
// We need this data in NodeStore before Connect() sets up the primary routes, because
|
||||
// SubnetRoutes() calculates the intersection of announced and approved routes. If we
|
||||
// call Connect() first, SubnetRoutes() returns empty (no announced routes yet), causing
|
||||
// Process the initial [tailcfg.MapRequest] to update node state (endpoints, hostinfo, etc.)
|
||||
// This must be done BEFORE calling [state.State.Connect] to ensure routes are properly synchronized.
|
||||
// When nodes reconnect, they send their hostinfo with announced routes in the [tailcfg.MapRequest].
|
||||
// We need this data in [state.NodeStore] before [state.State.Connect] sets up the primary routes, because
|
||||
// [types.NodeView.SubnetRoutes] calculates the intersection of announced and approved routes. If we
|
||||
// call [state.State.Connect] first, [types.NodeView.SubnetRoutes] returns empty (no announced routes yet), causing
|
||||
// the node to be incorrectly removed from AvailableRoutes.
|
||||
mapReqChange, err := m.h.state.UpdateNodeFromMapRequest(m.node.ID, m.req)
|
||||
if err != nil {
|
||||
|
|
@ -229,8 +229,8 @@ func (m *mapSession) serveLongPoll() {
|
|||
|
||||
// Connect the node after its state has been updated.
|
||||
// We send two separate change notifications because these are distinct operations:
|
||||
// 1. UpdateNodeFromMapRequest: processes the client's reported state (routes, endpoints, hostinfo)
|
||||
// 2. Connect: marks the node online and recalculates primary routes based on the updated state
|
||||
// 1. [state.State.UpdateNodeFromMapRequest]: processes the client's reported state (routes, endpoints, hostinfo)
|
||||
// 2. [state.State.Connect]: marks the node online and recalculates primary routes based on the updated state
|
||||
// While this results in two notifications, it ensures route data is synchronized before
|
||||
// primary route selection occurs, which is critical for proper HA subnet router failover.
|
||||
var connectChanges []change.Change
|
||||
|
|
@ -308,8 +308,8 @@ func (m *mapSession) serveLongPoll() {
|
|||
|
||||
// writeMap writes the map response to the client.
|
||||
// It handles compression if requested and any headers that need to be set.
|
||||
// It also handles flushing the response if the ResponseWriter
|
||||
// implements http.Flusher.
|
||||
// It also handles flushing the response if the [http.ResponseWriter]
|
||||
// implements [http.Flusher].
|
||||
func (m *mapSession) writeMap(msg *tailcfg.MapResponse) error {
|
||||
jsonBody, err := json.Marshal(msg)
|
||||
if err != nil {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue