diff --git a/cmd/server_test.go b/cmd/server_test.go
index bd97217e3..c74d2433f 100644
--- a/cmd/server_test.go
+++ b/cmd/server_test.go
@@ -1693,7 +1693,7 @@ func (s *TestSuiteCommon) TestListObjectsHandler(c *check) {
{getListObjectsV2URL(s.endPoint, bucketName, "", "1000", "", "url"), []string{"foo+bar+1", "foo+bar+2"}},
}
- for i, testCase := range testCases {
+ for _, testCase := range testCases {
// create listObjectsV1 request with valid parameters
request, err = newTestSignedRequest("GET", testCase.getURL, 0, nil, s.accessKey, s.secretKey, s.signer)
c.Assert(err, nil)
@@ -1706,7 +1706,6 @@ func (s *TestSuiteCommon) TestListObjectsHandler(c *check) {
getContent, err := ioutil.ReadAll(response.Body)
c.Assert(err, nil)
- fmt.Printf("Test %d: %+v vs %+v\n", i+1, string(getContent), testCase.expectedStrings)
for _, expectedStr := range testCase.expectedStrings {
c.Assert(strings.Contains(string(getContent), expectedStr), true)
}
diff --git a/cmd/xl-sets.go b/cmd/xl-sets.go
index ab3f60e8e..92d46be40 100644
--- a/cmd/xl-sets.go
+++ b/cmd/xl-sets.go
@@ -641,22 +641,27 @@ func (s *xlSets) CopyObject(ctx context.Context, srcBucket, srcObject, destBucke
// Returns function "listDir" of the type listDirFunc.
// isLeaf - is used by listDir function to check if an entry is a leaf or non-leaf entry.
// disks - used for doing disk.ListDir(). Sets passes set of disks.
-func listDirSetsFactory(ctx context.Context, isLeaf isLeafFunc, isLeafDir isLeafDirFunc, sets ...[]StorageAPI) listDirFunc {
+func listDirSetsFactory(ctx context.Context, isLeaf isLeafFunc, isLeafDir isLeafDirFunc, sets ...*xlObjects) listDirFunc {
listDirInternal := func(bucket, prefixDir, prefixEntry string, disks []StorageAPI) (mergedEntries []string) {
- for _, disk := range disks {
+ var diskEntries = make([][]string, len(disks))
+ var wg sync.WaitGroup
+ for index, disk := range disks {
if disk == nil {
continue
}
+ wg.Add(1)
+ go func(index int, disk StorageAPI) {
+ defer wg.Done()
+ diskEntries[index], _ = disk.ListDir(bucket, prefixDir, -1)
+ }(index, disk)
+ }
- var entries []string
+ wg.Wait()
+
+ // Find elements in entries which are not in mergedEntries
+ for _, entries := range diskEntries {
var newEntries []string
- var err error
- entries, err = disk.ListDir(bucket, prefixDir, -1)
- if err != nil {
- continue
- }
- // Find elements in entries which are not in mergedEntries
for _, entry := range entries {
idx := sort.SearchStrings(mergedEntries, entry)
// if entry is already present in mergedEntries don't add.
@@ -672,16 +677,16 @@ func listDirSetsFactory(ctx context.Context, isLeaf isLeafFunc, isLeafDir isLeaf
sort.Strings(mergedEntries)
}
}
+
return mergedEntries
}
// listDir - lists all the entries at a given prefix and given entry in the prefix.
listDir := func(bucket, prefixDir, prefixEntry string) (mergedEntries []string, delayIsLeaf bool) {
- for _, disks := range sets {
- entries := listDirInternal(bucket, prefixDir, prefixEntry, disks)
+ for _, set := range sets {
var newEntries []string
// Find elements in entries which are not in mergedEntries
- for _, entry := range entries {
+ for _, entry := range listDirInternal(bucket, prefixDir, prefixEntry, set.getLoadBalancedDisks()) {
idx := sort.SearchStrings(mergedEntries, entry)
// if entry is already present in mergedEntries don't add.
if idx < len(mergedEntries) && mergedEntries[idx] == entry {
@@ -696,8 +701,7 @@ func listDirSetsFactory(ctx context.Context, isLeaf isLeafFunc, isLeafDir isLeaf
sort.Strings(mergedEntries)
}
}
- mergedEntries, delayIsLeaf = filterListEntries(bucket, prefixDir, mergedEntries, prefixEntry, isLeaf)
- return mergedEntries, delayIsLeaf
+ return filterListEntries(bucket, prefixDir, mergedEntries, prefixEntry, isLeaf)
}
return listDir
}
@@ -743,12 +747,7 @@ func (s *xlSets) ListObjects(ctx context.Context, bucket, prefix, marker, delimi
return false
}
- var setDisks = make([][]StorageAPI, len(s.sets))
- for _, set := range s.sets {
- setDisks = append(setDisks, set.getLoadBalancedDisks())
- }
-
- listDir := listDirSetsFactory(ctx, isLeaf, isLeafDir, setDisks...)
+ listDir := listDirSetsFactory(ctx, isLeaf, isLeafDir, s.sets...)
walkResultCh = startTreeWalk(ctx, bucket, prefix, marker, recursive, listDir, isLeaf, isLeafDir, endWalkCh)
}
@@ -1353,12 +1352,7 @@ func (s *xlSets) listObjectsHeal(ctx context.Context, bucket, prefix, marker, de
return false
}
- var setDisks = make([][]StorageAPI, len(s.sets))
- for _, set := range s.sets {
- setDisks = append(setDisks, set.getLoadBalancedDisks())
- }
-
- listDir := listDirSetsFactory(ctx, isLeaf, isLeafDir, setDisks...)
+ listDir := listDirSetsFactory(ctx, isLeaf, isLeafDir, s.sets...)
walkResultCh = startTreeWalk(ctx, bucket, prefix, marker, recursive, listDir, isLeaf, isLeafDir, endWalkCh)
}