From 158b8c2e86bdd4553e5907bd4642a00cd705e017 Mon Sep 17 00:00:00 2001 From: Anis Elleuch Date: Wed, 22 May 2019 21:36:16 +0100 Subject: [PATCH] sets: Correctly set IsTruncated in listing (#7675) IsTruncated should not be set to true if there is no further possible entries beyond maxKeys. This commit will also move wide testing on object API from xl to xl sets. --- cmd/test-utils_test.go | 6 +++--- cmd/xl-sets.go | 19 +++++++++++++++---- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/cmd/test-utils_test.go b/cmd/test-utils_test.go index b77bf9e36..3eee1596f 100644 --- a/cmd/test-utils_test.go +++ b/cmd/test-utils_test.go @@ -174,7 +174,7 @@ func prepareFS() (ObjectLayer, string, error) { return obj, fsDirs[0], nil } -func prepareXL32() (ObjectLayer, []string, error) { +func prepareXLSets32() (ObjectLayer, []string, error) { fsDirs1, err := getRandomDisks(16) if err != nil { return nil, nil, err @@ -1704,7 +1704,7 @@ func prepareTestBackend(instanceType string) (ObjectLayer, []string, error) { switch instanceType { // Total number of disks for XL sets backend is set to 32. case XLSetsTestStr: - return prepareXL32() + return prepareXLSets32() // Total number of disks for XL backend is set to 16. case XLTestStr: return prepareXL16() @@ -1986,7 +1986,7 @@ func ExecObjectLayerTest(t TestErrHandler, objTest objTestType) { // Executing the object layer tests for single node setup. objTest(objLayer, FSTestStr, t) - objLayer, fsDirs, err := prepareXL16() + objLayer, fsDirs, err := prepareXLSets32() if err != nil { t.Fatalf("Initialization of object layer failed for XL setup: %s", err) } diff --git a/cmd/xl-sets.go b/cmd/xl-sets.go index c79e453c6..e3b7ed203 100644 --- a/cmd/xl-sets.go +++ b/cmd/xl-sets.go @@ -858,10 +858,21 @@ func leastEntry(entriesCh []FileInfoCh, readQuorum int) (FileInfo, bool) { // mergeEntriesCh - merges FileInfo channel to entries upto maxKeys. func mergeEntriesCh(entriesCh []FileInfoCh, maxKeys int, readQuorum int) (entries FilesInfo) { - for i := 0; i < maxKeys; { - var fi FileInfo - fi, entries.IsTruncated = leastEntry(entriesCh, readQuorum) - if !entries.IsTruncated { + var i = 0 + for { + fi, valid := leastEntry(entriesCh, readQuorum) + if !valid { + break + } + if i == maxKeys { + entries.IsTruncated = true + // Re-insert the last entry so it can be + // listed in the next listing iteration. + for j := range entriesCh { + if !entriesCh[j].Valid { + entriesCh[j].Push(fi) + } + } break } entries.Files = append(entries.Files, fi)