From 0fe9e9525086d7e01604c00a5511a5af61d5645e Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Thu, 16 Aug 2018 16:49:38 -0700 Subject: [PATCH] Validate prefixes on all sets (#6294) This PR fixes a regression introduced in 8eb838bf91bf7d98aa2ba9eac976e78c9530225e where hashing technique was used on prefixes to get the right set to perform the operation, this is not correct since prefixes and their corresponding keys might hash to a different value depending on the key length. For prefixes/directories we should look everywhere to support proper quorum based listing. Fixes #6293 --- cmd/xl-sets.go | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/cmd/xl-sets.go b/cmd/xl-sets.go index 93220f421..68dde9ec6 100644 --- a/cmd/xl-sets.go +++ b/cmd/xl-sets.go @@ -714,7 +714,15 @@ func (s *xlSets) ListObjects(ctx context.Context, bucket, prefix, marker, delimi } isLeafDir := func(bucket, entry string) bool { - return s.getHashedSet(entry).isObjectDir(bucket, entry) + // Verify prefixes in all sets. + var ok bool + for _, set := range s.sets { + ok = set.isObjectDir(bucket, entry) + if ok { + return true + } + } + return false } var setDisks = make([][]StorageAPI, len(s.sets)) @@ -742,7 +750,13 @@ func (s *xlSets) ListObjects(ctx context.Context, bucket, prefix, marker, delimi var objInfo ObjectInfo var err error if hasSuffix(walkResult.entry, slashSeparator) { - objInfo, err = s.getHashedSet(walkResult.entry).getObjectInfoDir(ctx, bucket, walkResult.entry) + // Verify prefixes in all sets. + for _, set := range s.sets { + objInfo, err = set.getObjectInfoDir(ctx, bucket, walkResult.entry) + if err == nil { + break + } + } } else { objInfo, err = s.getHashedSet(walkResult.entry).getObjectInfo(ctx, bucket, walkResult.entry) } @@ -1349,7 +1363,14 @@ func (s *xlSets) listObjectsHeal(ctx context.Context, bucket, prefix, marker, de } isLeafDir := func(bucket, entry string) bool { - return s.getHashedSet(entry).isObjectDir(bucket, entry) + var ok bool + for _, set := range s.sets { + ok = set.isObjectDir(bucket, entry) + if ok { + return true + } + } + return false } var setDisks = make([][]StorageAPI, len(s.sets))