Revert "Optimize selector for single-matching items"

This reverts commit f93a270edc.
This commit is contained in:
Wojciech Tyczynski 2017-06-06 23:26:28 +02:00
parent 4a01f44b73
commit dbafff3eea
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.