From 255505a83bf97129cdb5527d993afe4db00fa3e8 Mon Sep 17 00:00:00 2001 From: "Bala.FA" Date: Wed, 10 Feb 2016 19:02:26 +0530 Subject: [PATCH 1/3] pkg/ioutils: remove usage of os.Lstat() in FTW() As os.Readdir() is used get file entries where statinfo is already present. This patch fixes to use statinfo provided by os.Readdir(). --- pkg/ioutils/filepath.go | 65 ++++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 37 deletions(-) diff --git a/pkg/ioutils/filepath.go b/pkg/ioutils/filepath.go index 1ba433601..d0ef305e3 100644 --- a/pkg/ioutils/filepath.go +++ b/pkg/ioutils/filepath.go @@ -46,45 +46,37 @@ func FTW(root string, walkFn FTWFunc) error { return walk(root, info, walkFn) } -// getRealName - gets the proper filename for sorting purposes -// Readdir() filters out directory names without separators, add -// them back for proper sorting results. -func getRealName(info os.FileInfo) string { - if info.IsDir() { - // Make sure directory has its end separator. - return info.Name() + string(os.PathSeparator) +// byName implements sort.Interface for sorting os.FileInfo list. +type byName []os.FileInfo + +func (f byName) Len() int { return len(f) } +func (f byName) Swap(i, j int) { f[i], f[j] = f[j], f[i] } +func (f byName) Less(i, j int) bool { + n1 := f[i].Name() + if f[i].IsDir() { + n1 = n1 + string(os.PathSeparator) } - return info.Name() + + n2 := f[j].Name() + if f[i].IsDir() { + n2 = n2 + string(os.PathSeparator) + } + + return n1 < n2 } -// readDirNames reads the directory named by dirname and returns +// readDir reads the directory named by dirname and returns // a sorted list of directory entries. -func readDirNames(dirname string) ([]string, error) { - names, err := readDirUnsortedNames(dirname) - if err != nil { - return nil, err - } - sort.Strings(names) - return names, nil -} - -func readDirUnsortedNames(dirname string) ([]string, error) { +func readDir(dirname string) (fi []os.FileInfo, err error) { f, err := os.Open(dirname) - if err != nil { - return nil, err + if err == nil { + defer f.Close() + if fi, err = f.Readdir(-1); fi != nil { + sort.Sort(byName(fi)) + } } - nameInfos, err := f.Readdir(-1) - if err != nil { - return nil, err - } - if err = f.Close(); err != nil { - return nil, err - } - var names []string - for _, nameInfo := range nameInfos { - names = append(names, getRealName(nameInfo)) - } - return names, nil + + return } // FTWFunc is the type of the function called for each file or directory @@ -125,13 +117,12 @@ func walk(path string, info os.FileInfo, walkFn FTWFunc) error { return nil } - names, err := readDirNames(path) + fis, err := readDir(path) if err != nil { return walkFn(path, info, err) } - for _, name := range names { - filename := filepath.Join(path, name) - fileInfo, err := os.Lstat(filename) + for _, fileInfo := range fis { + filename := filepath.Join(path, fileInfo.Name()) if err != nil { if err := walkFn(filename, fileInfo, err); err != nil && err != ErrSkipDir && err != ErrSkipFile { return err From 5e4b13f4bd830a8e538914451b7c1bf8128b00bd Mon Sep 17 00:00:00 2001 From: "Bala.FA" Date: Wed, 10 Feb 2016 20:05:46 +0530 Subject: [PATCH 2/3] remove unused functions --- pkg/ioutils/filepath.go | 18 +++++----- pkg/ioutils/ioutils.go | 65 ------------------------------------- pkg/ioutils/ioutils_test.go | 17 ++-------- 3 files changed, 13 insertions(+), 87 deletions(-) delete mode 100644 pkg/ioutils/ioutils.go diff --git a/pkg/ioutils/filepath.go b/pkg/ioutils/filepath.go index d0ef305e3..41a54f7ca 100644 --- a/pkg/ioutils/filepath.go +++ b/pkg/ioutils/filepath.go @@ -25,15 +25,17 @@ import ( ) // IsDirEmpty Check if a directory is empty -func IsDirEmpty(dirname string) (bool, error) { - names, err := ReadDirNamesN(dirname, 1) - if err != nil && err != io.EOF { - return false, err +func IsDirEmpty(dirname string) (status bool, err error) { + f, err := os.Open(dirname) + if err == nil { + defer f.Close() + if _, err = f.Readdirnames(1); err == io.EOF { + status = true + err = nil + } } - if len(names) > 0 { - return false, nil - } - return true, nil + + return } // FTW walks the file tree rooted at root, calling walkFn for each file or diff --git a/pkg/ioutils/ioutils.go b/pkg/ioutils/ioutils.go deleted file mode 100644 index 21273f3c6..000000000 --- a/pkg/ioutils/ioutils.go +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Minio Cloud Storage, (C) 2016 Minio, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ioutils - -import ( - "os" - "sort" -) - -// byName implements sort.Interface for sorting os.FileInfo list. -type byName []os.FileInfo - -func (f byName) Len() int { return len(f) } -func (f byName) Less(i, j int) bool { return f[i].Name() < f[j].Name() } -func (f byName) Swap(i, j int) { f[i], f[j] = f[j], f[i] } - -// ReadDirN reads the directory named by dirname and returns -// a list of sorted directory entries of size 'n'. -func ReadDirN(dirname string, n int) ([]os.FileInfo, error) { - f, err := os.Open(dirname) - if err != nil { - return nil, err - } - list, err := f.Readdir(n) - if err != nil { - return nil, err - } - if err = f.Close(); err != nil { - return nil, err - } - sort.Sort(byName(list)) - return list, nil -} - -// ReadDirNamesN reads the directory named by dirname and returns -// a list of sorted directory names of size 'n'. -func ReadDirNamesN(dirname string, n int) ([]string, error) { - f, err := os.Open(dirname) - if err != nil { - return nil, err - } - names, err := f.Readdirnames(n) - if err != nil { - return nil, err - } - if err = f.Close(); err != nil { - return nil, err - } - sort.Strings(names) - return names, nil -} diff --git a/pkg/ioutils/ioutils_test.go b/pkg/ioutils/ioutils_test.go index 996bd02cd..627c541e5 100644 --- a/pkg/ioutils/ioutils_test.go +++ b/pkg/ioutils/ioutils_test.go @@ -17,10 +17,8 @@ package ioutils_test import ( - "fmt" "io/ioutil" "os" - "path/filepath" "testing" "github.com/minio/minio/pkg/ioutils" @@ -35,20 +33,11 @@ type MySuite struct{} var _ = Suite(&MySuite{}) func (s *MySuite) TestIoutils(c *C) { - path, err := ioutil.TempDir(os.TempDir(), "minio-") + path, err := ioutil.TempDir(os.TempDir(), "minio-ioutils_test") c.Assert(err, IsNil) defer os.RemoveAll(path) - var count int - for count < 102 { - count++ - err = os.MkdirAll(filepath.Join(path, fmt.Sprintf("minio-%d", count)), 0700) - c.Assert(err, IsNil) - } - dirs, err := ioutils.ReadDirN(path, 100) + status, err := ioutils.IsDirEmpty(path) c.Assert(err, IsNil) - c.Assert(len(dirs), Equals, 100) - dirNames, err := ioutils.ReadDirNamesN(path, 100) - c.Assert(err, IsNil) - c.Assert(len(dirNames), Equals, 100) + c.Assert(status, Equals, True) } From 6e9d73426b16e1c57629765b770ddd8621a0123f Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Wed, 10 Feb 2016 13:33:36 -0800 Subject: [PATCH 3/3] pkg/ioutils: True should be true --- pkg/ioutils/ioutils_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/ioutils/ioutils_test.go b/pkg/ioutils/ioutils_test.go index 627c541e5..d316959f4 100644 --- a/pkg/ioutils/ioutils_test.go +++ b/pkg/ioutils/ioutils_test.go @@ -39,5 +39,5 @@ func (s *MySuite) TestIoutils(c *C) { status, err := ioutils.IsDirEmpty(path) c.Assert(err, IsNil) - c.Assert(status, Equals, True) + c.Assert(status, Equals, true) }