mirror of
https://github.com/pgsty/minio.git
synced 2026-08-08 23:33:30 +03:00
enhance multipart functions to use fsDirent (#1304)
* backend/fs: scanMulitpartDir returns directories only for recursive listing * backend/fs: enhance multipart functions to use fsDirent
This commit is contained in:
+29
-26
@@ -26,31 +26,34 @@ import (
|
||||
|
||||
// fsDirent carries directory entries.
|
||||
type fsDirent struct {
|
||||
name string
|
||||
modifiedTime time.Time // On Solaris and older unix distros this is empty.
|
||||
size int64 // On Solaris and older unix distros this is empty.
|
||||
isDir bool
|
||||
name string
|
||||
modTime time.Time // On Solaris and older unix distros this is empty.
|
||||
size int64 // On Solaris and older unix distros this is empty.
|
||||
mode os.FileMode
|
||||
}
|
||||
|
||||
// byDirentNames is a collection satisfying sort.Interface.
|
||||
type byDirentNames []fsDirent
|
||||
|
||||
func (d byDirentNames) Len() int { return len(d) }
|
||||
func (d byDirentNames) Swap(i, j int) { d[i], d[j] = d[j], d[i] }
|
||||
func (d byDirentNames) Less(i, j int) bool {
|
||||
n1 := d[i].name
|
||||
if d[i].isDir {
|
||||
n1 = n1 + string(os.PathSeparator)
|
||||
}
|
||||
|
||||
n2 := d[j].name
|
||||
if d[j].isDir {
|
||||
n2 = n2 + string(os.PathSeparator)
|
||||
}
|
||||
|
||||
return n1 < n2
|
||||
// IsDir - returns true if fsDirent is a directory
|
||||
func (ent fsDirent) IsDir() bool {
|
||||
return ent.mode.IsDir()
|
||||
}
|
||||
|
||||
// IsSymlink - returns true if fsDirent is a symbolic link
|
||||
func (ent fsDirent) IsSymlink() bool {
|
||||
return ent.mode&os.ModeSymlink == os.ModeSymlink
|
||||
}
|
||||
|
||||
// IsRegular - returns true if fsDirent is a regular file
|
||||
func (ent fsDirent) IsRegular() bool {
|
||||
return ent.mode.IsRegular()
|
||||
}
|
||||
|
||||
// byDirentName is a collection satisfying sort.Interface.
|
||||
type byDirentName []fsDirent
|
||||
|
||||
func (d byDirentName) Len() int { return len(d) }
|
||||
func (d byDirentName) Swap(i, j int) { d[i], d[j] = d[j], d[i] }
|
||||
func (d byDirentName) Less(i, j int) bool { return d[i].name < d[j].name }
|
||||
|
||||
// Using sort.Search() internally to jump to the file entry containing the prefix.
|
||||
func searchDirents(dirents []fsDirent, x string) int {
|
||||
processFunc := func(i int) bool {
|
||||
@@ -85,7 +88,7 @@ func treeWalk(bucketDir, prefixDir, entryPrefixMatch, marker string, recursive b
|
||||
objectInfo := ObjectInfo{}
|
||||
// Convert to full object name.
|
||||
objectInfo.Name = filepath.Join(prefixDir, dirent.name)
|
||||
if dirent.modifiedTime.IsZero() && dirent.size == 0 {
|
||||
if dirent.modTime.IsZero() && dirent.size == 0 {
|
||||
// ModifiedTime and Size are zero, Stat() and figure out
|
||||
// the actual values that need to be set.
|
||||
fi, err := os.Stat(filepath.Join(bucketDir, prefixDir, dirent.name))
|
||||
@@ -99,9 +102,9 @@ func treeWalk(bucketDir, prefixDir, entryPrefixMatch, marker string, recursive b
|
||||
} else {
|
||||
// If ModifiedTime or Size are set then use them
|
||||
// without attempting another Stat operation.
|
||||
objectInfo.ModifiedTime = dirent.modifiedTime
|
||||
objectInfo.ModifiedTime = dirent.modTime
|
||||
objectInfo.Size = dirent.size
|
||||
objectInfo.IsDir = dirent.isDir
|
||||
objectInfo.IsDir = dirent.IsDir()
|
||||
}
|
||||
if objectInfo.IsDir {
|
||||
// Add os.PathSeparator suffix again for directories as
|
||||
@@ -135,13 +138,13 @@ func treeWalk(bucketDir, prefixDir, entryPrefixMatch, marker string, recursive b
|
||||
dirents = dirents[searchDirents(dirents, markerDir):]
|
||||
*count += len(dirents)
|
||||
for i, dirent := range dirents {
|
||||
if i == 0 && markerDir == dirent.name && !dirent.isDir {
|
||||
if i == 0 && markerDir == dirent.name && !dirent.IsDir() {
|
||||
// If the first entry is not a directory
|
||||
// we need to skip this entry.
|
||||
*count--
|
||||
continue
|
||||
}
|
||||
if dirent.isDir && recursive {
|
||||
if dirent.IsDir() && recursive {
|
||||
// If the entry is a directory, we will need recurse into it.
|
||||
markerArg := ""
|
||||
if dirent.name == markerDir {
|
||||
|
||||
Reference in New Issue
Block a user