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 f93a270edc.

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.
pull/6/head
Kubernetes Submit Queue 2017-06-06 18:48:18 -07:00 committed by GitHub
commit 683b7ff81a
2 changed files with 3 additions and 38 deletions

View File

@ -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) {
if name, ok := p.MatchesSingle(); ok {
if key, err := e.KeyFunc(ctx, name); err == nil {
// For performance reasons, we can optimize the further computations of
// 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)
w, err := e.Storage.Watch(ctx, key, resourceVersion, p)
if err != nil {
return nil, err
}

View File

@ -72,42 +72,16 @@ func (s *SelectionPredicate) MatchesObjectAttributes(l labels.Set, f fields.Set,
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
// name.
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 "", 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)
// of objects that return <value> for a given index, a pair (<index name>, <value>)
// wil be returned.