From b183d968e961ff509a0990fc4e2e4d24dfb41cca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Fri, 8 Jul 2022 09:01:19 +0000 Subject: [PATCH] fix logic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jörn Friedrich Dreyer --- .../utils/indexer/index/autoincrement.go | 36 +++++++++--------- pkg/storage/utils/indexer/index/non_unique.go | 37 ++++++++++++------- pkg/storage/utils/indexer/index/unique.go | 37 +++++++++++-------- 3 files changed, 65 insertions(+), 45 deletions(-) diff --git a/pkg/storage/utils/indexer/index/autoincrement.go b/pkg/storage/utils/indexer/index/autoincrement.go index 1dc170cc443..66cef73c26b 100644 --- a/pkg/storage/utils/indexer/index/autoincrement.go +++ b/pkg/storage/utils/indexer/index/autoincrement.go @@ -80,33 +80,35 @@ func (idx *Autoincrement) Lookup(v string) ([]string, error) { // LookupCtx retieves multiple exact values and allows passing in a context func (idx *Autoincrement) LookupCtx(ctx context.Context, values ...string) ([]string, error) { - var allValues []string - var err error + var allValues map[string]struct{} if len(values) != 1 { - allValues, err = idx.storage.ReadDir(context.Background(), path.Join("/", idx.indexRootDir)) + // prefetch all values with one request + entries, err := idx.storage.ReadDir(context.Background(), path.Join("/", idx.indexRootDir)) if err != nil { return nil, err } - } else { - allValues = values + // convert known values to set + for _, e := range entries { + allValues[path.Base(e)] = struct{}{} + } } - valueSet := make(map[string]struct{}, len(allValues)) - for _, v := range allValues { - valueSet[path.Base(v)] = struct{}{} + // convert requestet values to set + valueSet := make(map[string]struct{}, len(values)) + for _, v := range values { + valueSet[v] = struct{}{} } var matches = []string{} - -for _, v := range values { - if _, ok := valueSet[v]; ok { - oldname, err := idx.storage.ResolveSymlink(context.Background(), path.Join("/", idx.indexRootDir, v)) - if err != nil { - continue - } - matches = append(matches, oldname) + for v := range valueSet { + if _, ok := allValues[v]; ok || len(allValues) == 0 { + oldname, err := idx.storage.ResolveSymlink(context.Background(), path.Join("/", idx.indexRootDir, v)) + if err != nil { + continue + } + matches = append(matches, oldname) + } } -} if len(matches) == 0 { var v string diff --git a/pkg/storage/utils/indexer/index/non_unique.go b/pkg/storage/utils/indexer/index/non_unique.go index a1c4ee4ba86..b57fe5f3d32 100644 --- a/pkg/storage/utils/indexer/index/non_unique.go +++ b/pkg/storage/utils/indexer/index/non_unique.go @@ -84,28 +84,39 @@ func (idx *NonUnique) Lookup(v string) ([]string, error) { // LookupCtx retieves multiple exact values and allows passing in a context func (idx *NonUnique) LookupCtx(ctx context.Context, values ...string) ([]string, error) { - allValues, err := idx.storage.ReadDir(context.Background(), path.Join("/", idx.indexRootDir)) + // prefetch all values with one request + entries, err := idx.storage.ReadDir(context.Background(), path.Join("/", idx.indexRootDir)) if err != nil { return nil, err } + // convert known values to set + allValues := make(map[string]struct{}, len(entries)) + for _, e := range entries { + allValues[path.Base(e)] = struct{}{} + } - valueSet := make(map[string]struct{}, len(allValues)) - for _, v := range allValues { - if idx.caseInsensitive { - valueSet[strings.ToLower(path.Base(v))] = struct{}{} - } else { - valueSet[path.Base(v)] = struct{}{} + // convert requestet values to set + valueSet := make(map[string]struct{}, len(values)) + if idx.caseInsensitive { + for _, v := range values { + valueSet[strings.ToLower(v)] = struct{}{} + } + } else { + for _, v := range values { + valueSet[v] = struct{}{} } } var matches = map[string]struct{}{} for v := range valueSet { - children, err := idx.storage.ReadDir(context.Background(), path.Join("/", idx.indexRootDir, v)) - if err != nil { - continue - } - for _, c := range children { - matches[path.Base(c)] = struct{}{} + if _, ok := allValues[v]; ok { + children, err := idx.storage.ReadDir(context.Background(), path.Join("/", idx.indexRootDir, v)) + if err != nil { + continue + } + for _, c := range children { + matches[path.Base(c)] = struct{}{} + } } } diff --git a/pkg/storage/utils/indexer/index/unique.go b/pkg/storage/utils/indexer/index/unique.go index 3e3bc3f96c3..6f4c0af2d27 100644 --- a/pkg/storage/utils/indexer/index/unique.go +++ b/pkg/storage/utils/indexer/index/unique.go @@ -79,33 +79,40 @@ func (idx *Unique) Lookup(v string) ([]string, error) { // LookupCtx retieves multiple exact values and allows passing in a context func (idx *Unique) LookupCtx(ctx context.Context, values ...string) ([]string, error) { - var allValues []string - var err error + var allValues map[string]struct{} if len(values) != 1 { - allValues, err = idx.storage.ReadDir(context.Background(), path.Join("/", idx.indexRootDir)) + // prefetch all values with one request + entries, err := idx.storage.ReadDir(context.Background(), path.Join("/", idx.indexRootDir)) if err != nil { return nil, err } - } else { - allValues = values + // convert known values to set + for _, e := range entries { + allValues[path.Base(e)] = struct{}{} + } } - valueSet := make(map[string]struct{}, len(allValues)) - for _, v := range allValues { - if idx.caseInsensitive { - valueSet[strings.ToLower(path.Base(v))] = struct{}{} - } else { - valueSet[path.Base(v)] = struct{}{} + // convert requestet values to set + valueSet := make(map[string]struct{}, len(values)) + if idx.caseInsensitive { + for _, v := range values { + valueSet[strings.ToLower(v)] = struct{}{} + } + } else { + for _, v := range values { + valueSet[v] = struct{}{} } } var matches = make([]string, 0) for v := range valueSet { - oldname, err := idx.storage.ResolveSymlink(context.Background(), path.Join(idx.indexRootDir, v)) - if err != nil { - continue + if _, ok := allValues[v]; ok || len(allValues) == 0 { + oldname, err := idx.storage.ResolveSymlink(context.Background(), path.Join(idx.indexRootDir, v)) + if err != nil { + continue + } + matches = append(matches, oldname) } - matches = append(matches, oldname) } if len(matches) == 0 {