Skip to content

Commit

Permalink
Merge pull request distribution#2702 from caervs/fix_path_enumeration
Browse files Browse the repository at this point in the history
Ignore missing paths during enumeration
  • Loading branch information
dmp42 authored Sep 5, 2018
2 parents 6d66d03 + 6b73a9a commit efa4c3b
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 1 deletion.
11 changes: 10 additions & 1 deletion registry/storage/driver/walk.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import (
"context"
"errors"
"sort"

"github.com/sirupsen/logrus"
)

// ErrSkipDir is used as a return value from onFileFunc to indicate that
Expand Down Expand Up @@ -32,7 +34,14 @@ func WalkFallback(ctx context.Context, driver StorageDriver, from string, f Walk
// performance bottleneck.
fileInfo, err := driver.Stat(ctx, child)
if err != nil {
return err
switch err.(type) {
case PathNotFoundError:
// repository was removed in between listing and enumeration. Ignore it.
logrus.WithField("path", child).Infof("ignoring deleted path")
continue
default:
return err
}
}
err = f(fileInfo)
if err == nil && fileInfo.IsDir() {
Expand Down
47 changes: 47 additions & 0 deletions registry/storage/driver/walk_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package driver

import (
"context"
"fmt"
"testing"
)

type changingFileSystem struct {
StorageDriver
fileset []string
keptFiles map[string]bool
}

func (cfs *changingFileSystem) List(ctx context.Context, path string) ([]string, error) {
return cfs.fileset, nil
}
func (cfs *changingFileSystem) Stat(ctx context.Context, path string) (FileInfo, error) {
kept, ok := cfs.keptFiles[path]
if ok && kept {
return &FileInfoInternal{
FileInfoFields: FileInfoFields{
Path: path,
},
}, nil
}
return nil, PathNotFoundError{}
}
func TestWalkFileRemoved(t *testing.T) {
d := &changingFileSystem{
fileset: []string{"zoidberg", "bender"},
keptFiles: map[string]bool{
"zoidberg": true,
},
}
infos := []FileInfo{}
err := WalkFallback(context.Background(), d, "", func(fileInfo FileInfo) error {
infos = append(infos, fileInfo)
return nil
})
if len(infos) != 1 || infos[0].Path() != "zoidberg" {
t.Errorf(fmt.Sprintf("unexpected path set during walk: %s", infos))
}
if err != nil {
t.Fatalf(err.Error())
}
}

0 comments on commit efa4c3b

Please sign in to comment.