java-topology/defects/prometheus/patch/prometheus-0001.patch

62 lines
2.1 KiB
Diff
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# UNDF: UNDF-2026-000000225
--- a/model/labels/labels_slicelabels.go
+++ b/model/labels/labels_slicelabels.go
@@ -415,14 +415,22 @@ func NewBuilder(base Labels) *Builder {
// Labels returns the labels from the builder.
// If no modifications were made, the original labels are returned.
func (b *Builder) Labels() Labels {
if len(b.del) == 0 && len(b.add) == 0 {
return b.base
}
+ // Build O(1) lookup sets once rather than calling slices.Contains (O(D)) and
+ // contains (O(A)) inside the O(L) base loop — avoids O(L×D) and O(L×A).
+ delSet := make(map[string]struct{}, len(b.del))
+ for _, n := range b.del {
+ delSet[n] = struct{}{}
+ }
+ addSet := make(map[string]struct{}, len(b.add))
+ for _, a := range b.add {
+ addSet[a.Name] = struct{}{}
+ }
+
expectedSize := max(len(b.base)+len(b.add)-len(b.del), 1)
res := make(Labels, 0, expectedSize)
for _, l := range b.base {
- if slices.Contains(b.del, l.Name) || contains(b.add, l.Name) {
+ if _, inDel := delSet[l.Name]; inDel {
+ continue
+ }
+ if _, inAdd := addSet[l.Name]; inAdd {
continue
}
res = append(res, l)
--- a/model/labels/labels_common.go
+++ b/model/labels/labels_common.go
@@ -204,12 +204,16 @@ func (b *Builder) Set(n, v string) *Builder {
// Get returns the current value of label n from the builder. It checks the
// pending-add slice first, then falls back to the base label set.
func (b *Builder) Get(n string) string {
- // Del() removes entries from .add but Set() does not remove from .del, so check .add first.
- for _, a := range b.add {
- if a.Name == n {
- return a.Value
- }
+ // Del() removes entries from .add but Set() does not remove from .del, so
+ // check .add first. Linear scan over b.add is acceptable: the add slice is
+ // bounded to the number of labels set in a single relabel rule (typically ≤5).
+ // For callers that repeatedly call Get on a large add slice, build a map once.
+ for i := range b.add {
+ if b.add[i].Name == n {
+ return b.add[i].Value
}
- if slices.Contains(b.del, n) {
- return ""
}
+ for _, d := range b.del {
+ if d == n {
+ return ""
+ }
+ }
return b.base.Get(n)
}