You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Private service routes can fail silently after a roll or on IPv4 #986
Private service routes from #851 have follow-ups that did not block the review. Each can leave a service unreachable with no error, or keep access longer than intended.
A router binary that rolls before the agent on a node cannot program service routes until the agent reloads.
Some services stay unreachable with no error and no metric, because a missing next hop falls back to the old behavior.
A pod with any default route on another link loses its VPC default route.
Persistent access has no limit on who may set it.
Done when each is fixed, or documented with its roll order or trust boundary. The detail is in the first comment.
serviceroutemap.OpenPinned now fails hard if service_peer_table is not pinned, and the pin exists only after the new usid program loads. Document the roll order, or treat a missing pin as the old fallback. Nothing tests the missing-pin case.
attachmentNextHop returns nil on a family mismatch or a missing PodSubnet, and SetPeer(nil) falls back to dest_addr. IPv4 virtual services and attachments with several subnets stay unreachable, and the new alert counts only programming errors. Return an error or count a metric.
In cni/netns.go, any default route on another link suppresses the VPC default, including blackhole, unreachable and ECMP defaults with LinkIndex 0. Require a unicast default with LinkIndex > 0.
ServiceRouteAuthorization.persistent drops the node-side deadline backstop. Only RBAC on ServiceRoutePolicy limits who sets it. State that only the network control plane writes these.
A router restart while the API is down likely leaves services gated off, since the policy-enabled gate is rebuilt from the API. TestPersistentPathSurvivesControllerOutageAndWithdraws covers only a running router.
The alert's runbook_url anchor #galacticservicerouteprogrammingfailing does not exist in the infra galactic runbook.
From #851 at a28836b: when a pod's veth disappears, recoverableEntries returns empty entries, repairDesired closes the node's policy gate, and every service route on that node is off until the whole policy is rebuilt. Pod churn triggers this. Withdraw only the affected intent's entries. Separately, clearWithdrawnAdvertisement clears the attachment's node, interfaces and PodSubnet. A cache-lag NotFound after a fast delete and recreate makes that status flap until the next reconcile.
Activity
ecv commentedon Oct 22, 2026
Detail, as of #851 at d67c997:
serviceroutemap.OpenPinnednow fails hard ifservice_peer_tableis not pinned, and the pin exists only after the new usid program loads. Document the roll order, or treat a missing pin as the old fallback. Nothing tests the missing-pin case.attachmentNextHopreturns nil on a family mismatch or a missingPodSubnet, andSetPeer(nil)falls back todest_addr. IPv4 virtual services and attachments with several subnets stay unreachable, and the new alert counts only programming errors. Return an error or count a metric.cni/netns.go, any default route on another link suppresses the VPC default, including blackhole, unreachable and ECMP defaults withLinkIndex0. Require a unicast default withLinkIndex > 0.ServiceRouteAuthorization.persistentdrops the node-side deadline backstop. Only RBAC on ServiceRoutePolicy limits who sets it. State that only the network control plane writes these.TestPersistentPathSurvivesControllerOutageAndWithdrawscovers only a running router.runbook_urlanchor#galacticservicerouteprogrammingfailingdoes not exist in the infra galactic runbook.ecv commentedon Oct 22, 2026
From #851 at a28836b: when a pod's veth disappears,
recoverableEntriesreturns empty entries,repairDesiredcloses the node's policy gate, and every service route on that node is off until the whole policy is rebuilt. Pod churn triggers this. Withdraw only the affected intent's entries. Separately,clearWithdrawnAdvertisementclears the attachment's node, interfaces and PodSubnet. A cache-lag NotFound after a fast delete and recreate makes that status flap until the next reconcile.