java-topology/defects/cilium/patch/0001-requirement-hasvalue-use-map-set.patch
russell@unturf.com 9934133dcf whitepaper: 312 sites / 151 ecosystems — wave2+3 defect tables and PDF rebuild
Add 88 new defect entries to HIGH and MEDIUM tables:
  HIGH: mysql-0001/0002, mariadb-0001, redis-0001/0002, valkey-0001/0002, openvpn-0001,
        vlc-0001, prometheus-0001, otel-collector-0001, cockroachdb-0001..0004,
        tidb-0001..0008, kubernetes-0001/0002, go-0001, kotlin-0002, scala-0001,
        allegro5-0001, sdl2-0001, grafana-0001, clickhouse-0001, duckdb-0001,
        mongodb-0001, envoy-0001, istio-0001, cilium-0001, linkerd2-0001,
        linux-0001/0002/0003, tor-0002/0003, curl-0001, julia-0001, lua-0001,
        perl5-0001, nats-0001, spring-0003/0004, tomcat-0001, onos-0002, odl-0002

  MEDIUM: helm-0001, mariadb-0002, openssl-0001/0002, memcached-0001,
          cassandra-0001..0004, flink-0001, storm-0001/0002, zookeeper-0001..0003,
          pip-0001, gradle-0001, nginx-0001, haproxy-0001, caddy-0001, varnish-0001,
          ffmpeg-0001, gstreamer-0001, raylib-0001, love2d-0001, php-0001/0002,
          r-source-0001, cpython-0002, ruby-0001, rabbitmq-0003/0004, activemq-0001,
          ovs-0001, onos-0003, odl-0002, jetty-0001

PDF: 976K
2026-03-27 15:23:43 -04:00

80 lines
2.9 KiB
Diff

diff --git a/pkg/k8s/slim/k8s/apis/labels/selector.go b/pkg/k8s/slim/k8s/apis/labels/selector.go
index 1234567..abcdef0 100644
--- a/pkg/k8s/slim/k8s/apis/labels/selector.go
+++ b/pkg/k8s/slim/k8s/apis/labels/selector.go
@@ -152,9 +152,11 @@ func (r Requirements) String() string {
// Requirement contains values, a key, and an operator that relates the key and values.
// The zero value of Requirement is invalid.
// Requirement implements both set based match and exact match.
// Requirement should be initialized via NewRequirement constructor for creating a valid Requirement.
type Requirement struct {
key string
operator selection.Operator
- // In huge majority of cases we have at most one value here.
- // It is generally faster to operate on a single-element slice
- // than on a single-element map, so we have a slice here.
- strValues []string
+ // strValues is a map for O(1) membership tests in hasValue().
+ // For Gt/Lt and serialization, strValueList preserves ordered iteration.
+ strValues map[string]struct{}
+ strValueList []string
}
@@ -210,7 +212,11 @@ func NewRequirement(key string, op selection.Operator, vals []string, opts ...fi
if err != nil {
allErrs = append(allErrs, err)
}
- return &Requirement{key: key, operator: op, strValues: vals}, allErrs.ToAggregate()
+ valSet := make(map[string]struct{}, len(vals))
+ for _, v := range vals {
+ valSet[v] = struct{}{}
+ }
+ return &Requirement{key: key, operator: op, strValues: valSet, strValueList: vals}, allErrs.ToAggregate()
}
@@ -216,7 +222,8 @@ func NewRequirement(key string, op selection.Operator, vals []string, opts ...fi
-func (r *Requirement) hasValue(value string) bool {
- return slices.Contains(r.strValues, value)
+// hasValue is O(1) via map lookup instead of O(n) slices.Contains.
+func (r *Requirement) hasValue(value string) bool {
+ _, ok := r.strValues[value]
+ return ok
}
@@ -260,7 +268,7 @@ func (r *Requirement) Matches(ls Labels) bool {
if len(r.strValues) != 1 {
...
}
- for i := range r.strValues {
- rValue, err = strconv.ParseInt(r.strValues[i], 10, 64)
+ for _, v := range r.strValueList {
+ rValue, err = strconv.ParseInt(v, 10, 64)
...
}
@@ -293,8 +301,8 @@ func (r *Requirement) Values() sets.String {
ret := sets.String{}
- for i := range r.strValues {
- ret.Insert(r.strValues[i])
+ for v := range r.strValues {
+ ret.Insert(v)
}
return ret
}
@@ -301,8 +309,7 @@ func (r *Requirement) ValuesUnsorted() []string {
- ret := make([]string, 0, len(r.strValues))
- ret = append(ret, r.strValues...)
- return ret
+ return append([]string(nil), r.strValueList...)
}
@@ -309,5 +317,5 @@ func (r *Requirement) String() string {
- return r.strValues
+ return r.strValueList
}
@@ -320,5 +328,5 @@ func (r Requirement) Equal(x Requirement) bool {
- return slices.Equal(r.strValues, x.strValues)
+ return slices.Equal(r.strValueList, x.strValueList)
}