From bff678770bdca1e52ed56297c54a9dc5cabd035f Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Thu, 31 Dec 2020 21:06:41 +0800 Subject: [PATCH] filer: Fix prefix matching (#1722) * `ListDirectoryEntries` takes a pattern, not a prefix, thus to match a prefix we have to include a wildcard character `*` * In the prefix match implementations in leveldb and leveldb2, we should continue instead of stop if the current entry does not match the prefix. --- weed/filer/leveldb/leveldb_store.go | 2 +- weed/filer/leveldb2/leveldb2_store.go | 2 +- weed/server/filer_grpc_server.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/weed/filer/leveldb/leveldb_store.go b/weed/filer/leveldb/leveldb_store.go index b879f3a6e..e0e98f2dc 100644 --- a/weed/filer/leveldb/leveldb_store.go +++ b/weed/filer/leveldb/leveldb_store.go @@ -175,7 +175,7 @@ func (store *LevelDBStore) ListDirectoryPrefixedEntries(ctx context.Context, ful for iter.Next() { key := iter.Key() if !bytes.HasPrefix(key, directoryPrefix) { - break + continue } fileName := getNameFromKey(key) if fileName == "" { diff --git a/weed/filer/leveldb2/leveldb2_store.go b/weed/filer/leveldb2/leveldb2_store.go index 4b41554b9..5027e4bb2 100644 --- a/weed/filer/leveldb2/leveldb2_store.go +++ b/weed/filer/leveldb2/leveldb2_store.go @@ -185,7 +185,7 @@ func (store *LevelDB2Store) ListDirectoryPrefixedEntries(ctx context.Context, fu for iter.Next() { key := iter.Key() if !bytes.HasPrefix(key, directoryPrefix) { - break + continue } fileName := getNameFromKey(key) if fileName == "" { diff --git a/weed/server/filer_grpc_server.go b/weed/server/filer_grpc_server.go index 38472df2a..bbbd0c5bf 100644 --- a/weed/server/filer_grpc_server.go +++ b/weed/server/filer_grpc_server.go @@ -61,7 +61,7 @@ func (fs *FilerServer) ListEntries(req *filer_pb.ListEntriesRequest, stream file lastFileName := req.StartFromFileName includeLastFile := req.InclusiveStartFrom for limit > 0 { - entries, err := fs.filer.ListDirectoryEntries(stream.Context(), util.FullPath(req.Directory), lastFileName, includeLastFile, paginationLimit, req.Prefix) + entries, err := fs.filer.ListDirectoryEntries(stream.Context(), util.FullPath(req.Directory), lastFileName, includeLastFile, paginationLimit, fmt.Sprintf("%s*", req.Prefix)) if err != nil { return err