diff --git a/cmd/metacache-walk.go b/cmd/metacache-walk.go index 6350179d3..f2022d742 100644 --- a/cmd/metacache-walk.go +++ b/cmd/metacache-walk.go @@ -121,6 +121,7 @@ func (s *xlStorage) WalkDir(ctx context.Context, opts WalkDirOptions, wr io.Writ if contextCanceled(ctx) { return ctx.Err() } + s.walkMu.Lock() entries, err := s.ListDir(ctx, opts.Bucket, current, -1) s.walkMu.Unlock() @@ -173,9 +174,9 @@ func (s *xlStorage) WalkDir(ctx context.Context, opts WalkDirOptions, wr io.Writ // If root was an object return it as such. if HasSuffix(entry, xlStorageFormatFile) { var meta metaCacheEntry - s.walkMu.Lock() + s.walkReadMu.Lock() meta.metadata, err = s.readMetadata(pathJoin(volumeDir, current, entry)) - s.walkMu.Unlock() + s.walkReadMu.Unlock() if err != nil { logger.LogIf(ctx, err) continue @@ -190,9 +191,9 @@ func (s *xlStorage) WalkDir(ctx context.Context, opts WalkDirOptions, wr io.Writ // Check legacy. if HasSuffix(entry, xlStorageFormatFileV1) { var meta metaCacheEntry - s.walkMu.Lock() + s.walkReadMu.Lock() meta.metadata, err = xioutil.ReadFile(pathJoin(volumeDir, current, entry)) - s.walkMu.Unlock() + s.walkReadMu.Unlock() if err != nil { logger.LogIf(ctx, err) continue @@ -248,9 +249,9 @@ func (s *xlStorage) WalkDir(ctx context.Context, opts WalkDirOptions, wr io.Writ meta.name = meta.name[:len(meta.name)-1] + globalDirSuffixWithSlash } - s.walkMu.Lock() + s.walkReadMu.Lock() meta.metadata, err = s.readMetadata(pathJoin(volumeDir, meta.name, xlStorageFormatFile)) - s.walkMu.Unlock() + s.walkReadMu.Unlock() switch { case err == nil: // It was an object @@ -259,9 +260,7 @@ func (s *xlStorage) WalkDir(ctx context.Context, opts WalkDirOptions, wr io.Writ } out <- meta case osIsNotExist(err), isSysErrIsDir(err): - s.walkMu.Lock() meta.metadata, err = xioutil.ReadFile(pathJoin(volumeDir, meta.name, xlStorageFormatFileV1)) - s.walkMu.Unlock() if err == nil { // It was an object out <- meta diff --git a/cmd/xl-storage.go b/cmd/xl-storage.go index 133d96292..e991c8082 100644 --- a/cmd/xl-storage.go +++ b/cmd/xl-storage.go @@ -142,7 +142,8 @@ type xlStorage struct { sync.RWMutex // mutex to prevent concurrent read operations overloading walks. - walkMu sync.Mutex + walkMu sync.Mutex + walkReadMu sync.Mutex } // checkPathLength - returns error if given path name length more than 255