diff --git a/cmd/fs-v1.go b/cmd/fs-v1.go index 3ff454903..708a071d9 100644 --- a/cmd/fs-v1.go +++ b/cmd/fs-v1.go @@ -1212,9 +1212,8 @@ func (fs *FSObjects) ListObjects(ctx context.Context, bucket, prefix, marker, de fs.listPool.Set(params, walkResultCh, endWalkCh) } - result := ListObjectsInfo{IsTruncated: !eof} + result := ListObjectsInfo{} for _, objInfo := range objInfos { - result.NextMarker = objInfo.Name if objInfo.IsDir && delimiter == slashSeparator { result.Prefixes = append(result.Prefixes, objInfo.Name) continue @@ -1222,6 +1221,13 @@ func (fs *FSObjects) ListObjects(ctx context.Context, bucket, prefix, marker, de result.Objects = append(result.Objects, objInfo) } + if !eof { + result.IsTruncated = true + if len(objInfos) > 0 { + result.NextMarker = objInfos[len(objInfos)-1].Name + } + } + // Success. return result, nil } diff --git a/cmd/object-api-listobjects_test.go b/cmd/object-api-listobjects_test.go index 367b5d8ce..e219254d9 100644 --- a/cmd/object-api-listobjects_test.go +++ b/cmd/object-api-listobjects_test.go @@ -574,6 +574,14 @@ func testListObjects(obj ObjectLayer, instanceType string, t TestErrHandler) { t.Errorf("Test %d: %s: Expected IsTruncated flag to be %v, but instead found it to be %v", i+1, instanceType, testCase.result.IsTruncated, result.IsTruncated) } + if testCase.result.IsTruncated && result.NextMarker == "" { + t.Errorf("Test %d: %s: Expected NextContinuationToken to contain a string since listing is truncated, but instead found it to be empty", i+1, instanceType) + } + + if !testCase.result.IsTruncated && result.NextMarker != "" { + t.Errorf("Test %d: %s: Expected NextContinuationToken to be empty since listing is not truncated, but instead found `%v`", i+1, instanceType, result.NextMarker) + } + } // Take ListObject treeWalk go-routine to completion, if available in the treewalk pool. if result.IsTruncated { diff --git a/cmd/xl-v1-list-objects.go b/cmd/xl-v1-list-objects.go index d8386f9b8..6bd92fdb6 100644 --- a/cmd/xl-v1-list-objects.go +++ b/cmd/xl-v1-list-objects.go @@ -130,15 +130,22 @@ func (xl xlObjects) listObjects(ctx context.Context, bucket, prefix, marker, del xl.listPool.Set(params, walkResultCh, endWalkCh) } - result := ListObjectsInfo{IsTruncated: !eof} + result := ListObjectsInfo{} for _, objInfo := range objInfos { - result.NextMarker = objInfo.Name if objInfo.IsDir && delimiter == slashSeparator { result.Prefixes = append(result.Prefixes, objInfo.Name) continue } result.Objects = append(result.Objects, objInfo) } + + if !eof { + result.IsTruncated = true + if len(objInfos) > 0 { + result.NextMarker = objInfos[len(objInfos)-1].Name + } + } + return result, nil }