Commit 683b7ff8 authored by Kubernetes Submit Queue's avatar Kubernetes Submit Queue Committed by GitHub

Merge pull request #47082 from wojtek-t/fix_node_conflicts

Automatic merge from submit-queue (batch tested with PRs 47083, 44115, 46881, 47082, 46577) Revert "Optimize selector for single-matching items" This reverts commit f93a270e. Fix: #46851 @smarterclayton The problem was that removing the requirement from the predicate resulted in not using "trigger" function in Cacher, which is super critical for performance. And this was messed up.
parents 379a15a4 dbafff3e
...@@ -1135,16 +1135,7 @@ func (e *Store) Watch(ctx genericapirequest.Context, options *metainternalversio ...@@ -1135,16 +1135,7 @@ func (e *Store) Watch(ctx genericapirequest.Context, options *metainternalversio
func (e *Store) WatchPredicate(ctx genericapirequest.Context, p storage.SelectionPredicate, resourceVersion string) (watch.Interface, error) { func (e *Store) WatchPredicate(ctx genericapirequest.Context, p storage.SelectionPredicate, resourceVersion string) (watch.Interface, error) {
if name, ok := p.MatchesSingle(); ok { if name, ok := p.MatchesSingle(); ok {
if key, err := e.KeyFunc(ctx, name); err == nil { if key, err := e.KeyFunc(ctx, name); err == nil {
// For performance reasons, we can optimize the further computations of w, err := e.Storage.Watch(ctx, key, resourceVersion, p)
// selector, by removing then "matches-single" fields, because they are
// already satisfied by choosing appropriate key.
sp, err := p.RemoveMatchesSingleRequirements()
if err != nil {
glog.Warningf("Couldn't remove matches-single requirements: %v", err)
// Since we couldn't optimize selector, reset to the original one.
sp = p
}
w, err := e.Storage.Watch(ctx, key, resourceVersion, sp)
if err != nil { if err != nil {
return nil, err return nil, err
} }
......
...@@ -72,42 +72,16 @@ func (s *SelectionPredicate) MatchesObjectAttributes(l labels.Set, f fields.Set, ...@@ -72,42 +72,16 @@ func (s *SelectionPredicate) MatchesObjectAttributes(l labels.Set, f fields.Set,
return matched return matched
} }
const matchesSingleField = "metadata.name"
func removeMatchesSingleField(field, value string) (string, string, error) {
if field == matchesSingleField {
return "", "", nil
}
return field, value, nil
}
// MatchesSingle will return (name, true) if and only if s.Field matches on the object's // MatchesSingle will return (name, true) if and only if s.Field matches on the object's
// name. // name.
func (s *SelectionPredicate) MatchesSingle() (string, bool) { func (s *SelectionPredicate) MatchesSingle() (string, bool) {
if name, ok := s.Field.RequiresExactMatch(matchesSingleField); ok { // TODO: should be namespace.name
if name, ok := s.Field.RequiresExactMatch("metadata.name"); ok {
return name, true return name, true
} }
return "", false return "", false
} }
func (s *SelectionPredicate) RemoveMatchesSingleRequirements() (SelectionPredicate, error) {
var fieldsSelector fields.Selector
if s.Field != nil {
var err error
fieldsSelector, err = s.Field.Transform(removeMatchesSingleField)
if err != nil {
return SelectionPredicate{}, err
}
}
return SelectionPredicate{
Label: s.Label,
Field: fieldsSelector,
IncludeUninitialized: s.IncludeUninitialized,
GetAttrs: s.GetAttrs,
IndexFields: s.IndexFields,
}, nil
}
// For any index defined by IndexFields, if a matcher can match only (a subset) // For any index defined by IndexFields, if a matcher can match only (a subset)
// of objects that return <value> for a given index, a pair (<index name>, <value>) // of objects that return <value> for a given index, a pair (<index name>, <value>)
// wil be returned. // wil be returned.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment