Skip to content

Commit

Permalink
Don't create new sets when checking compatability
Browse files Browse the repository at this point in the history
  • Loading branch information
jonathan-innis committed Feb 3, 2025
1 parent 16dfcb0 commit a7eb318
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 2 deletions.
40 changes: 40 additions & 0 deletions pkg/scheduling/requirement.go
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,46 @@ func (r *Requirement) Intersection(requirement *Requirement) *Requirement {
return &Requirement{Key: r.Key, values: values, complement: complement, greaterThan: greaterThan, lessThan: lessThan, MinValues: minValues}
}

// nolint:gocyclo
// HasIntersection is a more efficient implementation of Intersection
// It validates whether there is an intersection between the two requirements without actually creating the sets
// This prevents the garbage collector from having to spend cycles cleaning up all of these created set objects
func (r *Requirement) HasIntersection(requirement *Requirement) bool {
greaterThan := maxIntPtr(r.greaterThan, requirement.greaterThan)
lessThan := minIntPtr(r.lessThan, requirement.lessThan)
if greaterThan != nil && lessThan != nil && *greaterThan >= *lessThan {
return false
}
// Both requirements have a complement
if r.complement && requirement.complement {
return true
}
// Only one requirement has a complement
if r.complement && !requirement.complement {
for value := range requirement.values {
if !r.Has(value) && withinIntPtrs(value, greaterThan, lessThan) {
return true
}
}
return false
}
if !r.complement && requirement.complement {
for value := range r.values {
if !requirement.Has(value) && withinIntPtrs(value, greaterThan, lessThan) {
return true
}
}
return false
}
// Both requirements are non-complement requirements
for value := range r.values {
if requirement.Has(value) && withinIntPtrs(value, greaterThan, lessThan) {
return true
}
}
return false
}

func (r *Requirement) Any() string {
switch r.Operator() {
case corev1.NodeSelectorOpIn:
Expand Down
3 changes: 1 addition & 2 deletions pkg/scheduling/requirements.go
Original file line number Diff line number Diff line change
Expand Up @@ -284,8 +284,7 @@ func (r Requirements) Intersects(requirements Requirements) (errs error) {
for key := range r.intersectKeys(requirements) {
existing := r.Get(key)
incoming := requirements.Get(key)
// There must be some value, except
if existing.Intersection(incoming).Len() == 0 {
if !existing.HasIntersection(incoming) {
// where the incoming requirement has operator { NotIn, DoesNotExist }
if operator := incoming.Operator(); operator == corev1.NodeSelectorOpNotIn || operator == corev1.NodeSelectorOpDoesNotExist {
// and the existing requirement has operator { NotIn, DoesNotExist }
Expand Down

0 comments on commit a7eb318

Please sign in to comment.