mirror of
https://github.com/minio/minio.git
synced 2025-02-02 17:35:58 -05:00
Merge pull request #915 from harshavardhana/delete-bucket
Implement delete bucket properly with proper error handlings
This commit is contained in:
commit
c24235df8b
16
pkg/fs/fs.go
16
pkg/fs/fs.go
@ -17,7 +17,6 @@
|
|||||||
package fs
|
package fs
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"os"
|
"os"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strings"
|
"strings"
|
||||||
@ -94,21 +93,16 @@ func (fs API) DeleteBucket(bucket string) *probe.Error {
|
|||||||
if _, err := os.Stat(bucketDir); os.IsNotExist(err) {
|
if _, err := os.Stat(bucketDir); os.IsNotExist(err) {
|
||||||
return probe.NewError(BucketNotFound{Bucket: bucket})
|
return probe.NewError(BucketNotFound{Bucket: bucket})
|
||||||
}
|
}
|
||||||
var errNotEmpty = errors.New("Directory Not empty")
|
if err := RemoveAllDirs(bucketDir); err != nil {
|
||||||
isDirNotEmpty := func(fp string, fl os.FileInfo, err error) error {
|
if err == ErrDirNotEmpty || strings.Contains(err.Error(), "directory not empty") {
|
||||||
if fl.Mode().IsRegular() || fl.Mode()&os.ModeSymlink == os.ModeSymlink {
|
|
||||||
return errNotEmpty
|
|
||||||
}
|
|
||||||
return ErrSkipDir
|
|
||||||
}
|
|
||||||
err := WalkUnsorted(bucketDir, isDirNotEmpty)
|
|
||||||
if err != nil {
|
|
||||||
if err == errNotEmpty {
|
|
||||||
return probe.NewError(BucketNotEmpty{Bucket: bucket})
|
return probe.NewError(BucketNotEmpty{Bucket: bucket})
|
||||||
}
|
}
|
||||||
return probe.NewError(err)
|
return probe.NewError(err)
|
||||||
}
|
}
|
||||||
if err := os.Remove(bucketDir); err != nil {
|
if err := os.Remove(bucketDir); err != nil {
|
||||||
|
if strings.Contains(err.Error(), "directory not empty") {
|
||||||
|
return probe.NewError(BucketNotEmpty{Bucket: bucket})
|
||||||
|
}
|
||||||
return probe.NewError(err)
|
return probe.NewError(err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
@ -23,6 +23,32 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// RemoveAllDirs - removes only itself and all subdirectories
|
||||||
|
func RemoveAllDirs(path string) error {
|
||||||
|
allFiles := func(fp string, fl os.FileInfo, err error) error {
|
||||||
|
if fp == path {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if fl.Mode().IsRegular() || fl.Mode()&os.ModeSymlink == os.ModeSymlink {
|
||||||
|
return ErrDirNotEmpty
|
||||||
|
}
|
||||||
|
if fl.Mode().IsDir() {
|
||||||
|
if err := os.Remove(fp); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
err := WalkUnsorted(path, allFiles)
|
||||||
|
if err != nil {
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// Walk walks the file tree rooted at root, calling walkFn for each file or
|
// Walk walks the file tree rooted at root, calling walkFn for each file or
|
||||||
// directory in the tree, including root.
|
// directory in the tree, including root.
|
||||||
func Walk(root string, walkFn WalkFunc) error {
|
func Walk(root string, walkFn WalkFunc) error {
|
||||||
@ -84,6 +110,10 @@ var ErrSkipDir = errors.New("skip this directory")
|
|||||||
// as an error by any function.
|
// as an error by any function.
|
||||||
var ErrSkipFile = errors.New("skip this file")
|
var ErrSkipFile = errors.New("skip this file")
|
||||||
|
|
||||||
|
// ErrDirNotEmpty is used to throw error on directories which have atleast one regular
|
||||||
|
// file or a symlink left
|
||||||
|
var ErrDirNotEmpty = errors.New("directory not empty")
|
||||||
|
|
||||||
func walkUnsorted(path string, info os.FileInfo, walkFn WalkFunc) error {
|
func walkUnsorted(path string, info os.FileInfo, walkFn WalkFunc) error {
|
||||||
err := walkFn(path, info, nil)
|
err := walkFn(path, info, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user