mirror of
https://github.com/minio/minio.git
synced 2025-02-28 05:49:16 -05:00
listing: Fix result when prefix is an object with a slash (#10267)
In a non recursive mode, issuing a list request where prefix is an existing object with a slash and delimiter is a slash will return entries in the object directory (data dir IDs) ``` $ aws s3api --profile minioadmin --endpoint-url http://localhost:9000 \ list-objects-v2 --bucket testbucket --prefix code_of_conduct.md/ --delimiter '/' { "CommonPrefixes": [ { "Prefix": "code_of_conduct.md/ec750fe0-ea7e-4b87-bbec-1e32407e5e47/" } ] } ``` This commit adds a fast exit track in Walk() in this specific case.
This commit is contained in:
parent
a4463dd40f
commit
51ba1dac49
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* MinIO Cloud Storage, (C) 2015-2016, 2017 MinIO, Inc.
|
* MinIO Cloud Storage, (C) 2015-2020 MinIO, Inc.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -448,7 +448,9 @@ func testListObjects(obj ObjectLayer, instanceType string, t1 TestErrHandler) {
|
|||||||
{Name: "temporary/0/"},
|
{Name: "temporary/0/"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
// ListObjectsResult-34 Listing with marker > last object should return empty
|
// ListObjectsResult-34:
|
||||||
|
// * Listing with marker > last object should return empty
|
||||||
|
// * Listing an object with a trailing slash and '/' delimiter
|
||||||
{
|
{
|
||||||
IsTruncated: false,
|
IsTruncated: false,
|
||||||
Objects: []ObjectInfo{},
|
Objects: []ObjectInfo{},
|
||||||
@ -569,6 +571,8 @@ func testListObjects(obj ObjectLayer, instanceType string, t1 TestErrHandler) {
|
|||||||
{"test-bucket-empty-dir", "", "temporary/", "", 10, resultCases[33], nil, true},
|
{"test-bucket-empty-dir", "", "temporary/", "", 10, resultCases[33], nil, true},
|
||||||
// Test listing with marker > last object such that response should be empty (65)
|
// Test listing with marker > last object such that response should be empty (65)
|
||||||
{"test-bucket-single-object", "", "A/C", "", 1000, resultCases[34], nil, true},
|
{"test-bucket-single-object", "", "A/C", "", 1000, resultCases[34], nil, true},
|
||||||
|
// Test listing an object with a trailing slash and a slash delimiter (66)
|
||||||
|
{"test-bucket-list-object", "Asia-maps.png/", "", "/", 1000, resultCases[34], nil, true},
|
||||||
}
|
}
|
||||||
|
|
||||||
for i, testCase := range testCases {
|
for i, testCase := range testCases {
|
||||||
|
@ -949,6 +949,14 @@ func (s *xlStorage) Walk(volume, dirPath, marker string, recursive bool, endWalk
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fast exit track to check if we are listing an object with
|
||||||
|
// a trailing slash, this will avoid to list the object content.
|
||||||
|
if HasSuffix(dirPath, SlashSeparator) {
|
||||||
|
if st, err := os.Stat(pathJoin(volumeDir, dirPath, xlStorageFormatFile)); err == nil && st.Mode().IsRegular() {
|
||||||
|
return nil, errFileNotFound
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// buffer channel matches the S3 ListObjects implementation
|
// buffer channel matches the S3 ListObjects implementation
|
||||||
ch = make(chan FileInfo, maxObjectList)
|
ch = make(chan FileInfo, maxObjectList)
|
||||||
go func() {
|
go func() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user