java-topology/defects/nats-server/patch/nats-server-0001-diff-routes-map.patch

56 lines
1.5 KiB
Diff

# UNDF: UNDF-2026-000000179
# UNDF: (leave blank)
--- a/server/reload.go
+++ b/server/reload.go
@@ -2605,26 +2605,27 @@ func diffProxiesTrustedKeys(old, new []*ProxyConfig) ([]string, []string) {
// diffRoutes diffs the old routes and the new routes and returns the ones that
// should be added and removed from the server.
func diffRoutes(old, new []*url.URL) (add, remove []*url.URL) {
- // Find routes to remove.
-removeLoop:
- for _, oldRoute := range old {
- for _, newRoute := range new {
- if urlsAreEqual(oldRoute, newRoute) {
- continue removeLoop
- }
+ // Build O(1)-lookup sets from each list's canonical URL strings.
+ // This replaces two O(R²) nested loops with two O(R) passes.
+ newSet := make(map[string]struct{}, len(new))
+ for _, u := range new {
+ if u != nil {
+ newSet[u.String()] = struct{}{}
}
- remove = append(remove, oldRoute)
}
-
- // Find routes to add.
-addLoop:
- for _, newRoute := range new {
- for _, oldRoute := range old {
- if urlsAreEqual(oldRoute, newRoute) {
- continue addLoop
- }
+ oldSet := make(map[string]struct{}, len(old))
+ for _, u := range old {
+ if u != nil {
+ oldSet[u.String()] = struct{}{}
}
- add = append(add, newRoute)
}
+ for _, oldRoute := range old {
+ if oldRoute != nil {
+ if _, found := newSet[oldRoute.String()]; !found {
+ remove = append(remove, oldRoute)
+ }
+ }
+ }
+ for _, newRoute := range new {
+ if newRoute != nil {
+ if _, found := oldSet[newRoute.String()]; !found {
+ add = append(add, newRoute)
+ }
+ }
+ }
return add, remove
}