Switch to using functional options
Keeps the interface cleaner and avoids changes from callers. Signed-off-by: James Hewitt <james.hewitt@uk.ibm.com>
This commit is contained in:
parent
36b9d78fed
commit
fcc3632801
9 changed files with 34 additions and 49 deletions
|
@ -27,7 +27,7 @@ func (reg *registry) Repositories(ctx context.Context, repos []string, last stri
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = reg.blobStore.driver.WalkWithStartAfterHint(ctx, root, last, func(fileInfo driver.FileInfo) error {
|
err = reg.blobStore.driver.Walk(ctx, root, func(fileInfo driver.FileInfo) error {
|
||||||
err := handleRepository(fileInfo, root, last, func(repoPath string) error {
|
err := handleRepository(fileInfo, root, last, func(repoPath string) error {
|
||||||
foundRepos = append(foundRepos, repoPath)
|
foundRepos = append(foundRepos, repoPath)
|
||||||
return nil
|
return nil
|
||||||
|
@ -43,7 +43,7 @@ func (reg *registry) Repositories(ctx context.Context, repos []string, last stri
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
})
|
}, driver.WithStartAfterHint(last))
|
||||||
|
|
||||||
n = copy(repos, foundRepos)
|
n = copy(repos, foundRepos)
|
||||||
|
|
||||||
|
|
|
@ -385,15 +385,8 @@ func (d *driver) URLFor(ctx context.Context, path string, options map[string]int
|
||||||
|
|
||||||
// Walk traverses a filesystem defined within driver, starting
|
// Walk traverses a filesystem defined within driver, starting
|
||||||
// from the given path, calling f on each file and directory
|
// from the given path, calling f on each file and directory
|
||||||
func (d *driver) Walk(ctx context.Context, path string, f storagedriver.WalkFn) error {
|
func (d *driver) Walk(ctx context.Context, path string, f storagedriver.WalkFn, options ...func(*storagedriver.WalkOptions)) error {
|
||||||
return storagedriver.WalkFallback(ctx, d, path, f)
|
return storagedriver.WalkFallback(ctx, d, path, f, options...)
|
||||||
}
|
|
||||||
|
|
||||||
// WalkWithStartAfterHint traverses a filesystem defined within driver, starting
|
|
||||||
// from the given path, calling f on each file and directory. The hint is ignored
|
|
||||||
// because it is not yet implemented.
|
|
||||||
func (d *driver) WalkWithStartAfterHint(ctx context.Context, path string, _ string, f storagedriver.WalkFn) error {
|
|
||||||
return d.Walk(ctx, path, f)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// directDescendants will find direct descendants (blobs or virtual containers)
|
// directDescendants will find direct descendants (blobs or virtual containers)
|
||||||
|
|
|
@ -226,7 +226,7 @@ func (base *Base) URLFor(ctx context.Context, path string, options map[string]in
|
||||||
}
|
}
|
||||||
|
|
||||||
// Walk wraps Walk of underlying storage driver.
|
// Walk wraps Walk of underlying storage driver.
|
||||||
func (base *Base) Walk(ctx context.Context, path string, f storagedriver.WalkFn) error {
|
func (base *Base) Walk(ctx context.Context, path string, f storagedriver.WalkFn, options ...func(*storagedriver.WalkOptions)) error {
|
||||||
ctx, done := dcontext.WithTrace(ctx)
|
ctx, done := dcontext.WithTrace(ctx)
|
||||||
defer done("%s.Walk(%q)", base.Name(), path)
|
defer done("%s.Walk(%q)", base.Name(), path)
|
||||||
|
|
||||||
|
@ -234,5 +234,5 @@ func (base *Base) Walk(ctx context.Context, path string, f storagedriver.WalkFn)
|
||||||
return storagedriver.InvalidPathError{Path: path, DriverName: base.StorageDriver.Name()}
|
return storagedriver.InvalidPathError{Path: path, DriverName: base.StorageDriver.Name()}
|
||||||
}
|
}
|
||||||
|
|
||||||
return base.setDriverName(base.StorageDriver.Walk(ctx, path, f))
|
return base.setDriverName(base.StorageDriver.Walk(ctx, path, f, options...))
|
||||||
}
|
}
|
||||||
|
|
|
@ -290,15 +290,8 @@ func (d *driver) URLFor(ctx context.Context, path string, options map[string]int
|
||||||
|
|
||||||
// Walk traverses a filesystem defined within driver, starting
|
// Walk traverses a filesystem defined within driver, starting
|
||||||
// from the given path, calling f on each file and directory
|
// from the given path, calling f on each file and directory
|
||||||
func (d *driver) Walk(ctx context.Context, path string, f storagedriver.WalkFn) error {
|
func (d *driver) Walk(ctx context.Context, path string, f storagedriver.WalkFn, options ...func(*storagedriver.WalkOptions)) error {
|
||||||
return storagedriver.WalkFallback(ctx, d, path, f)
|
return storagedriver.WalkFallback(ctx, d, path, f, options...)
|
||||||
}
|
|
||||||
|
|
||||||
// WalkWithStartAfterHint traverses a filesystem defined within driver, starting
|
|
||||||
// from the given path, calling f on each file and directory. The hint is ignored
|
|
||||||
// because it is not yet implemented.
|
|
||||||
func (d *driver) WalkWithStartAfterHint(ctx context.Context, path string, _ string, f storagedriver.WalkFn) error {
|
|
||||||
return d.Walk(ctx, path, f)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// fullPath returns the absolute path of a key within the Driver's storage.
|
// fullPath returns the absolute path of a key within the Driver's storage.
|
||||||
|
|
|
@ -849,8 +849,8 @@ func (d *driver) URLFor(ctx context.Context, path string, options map[string]int
|
||||||
|
|
||||||
// Walk traverses a filesystem defined within driver, starting
|
// Walk traverses a filesystem defined within driver, starting
|
||||||
// from the given path, calling f on each file
|
// from the given path, calling f on each file
|
||||||
func (d *driver) Walk(ctx context.Context, path string, f storagedriver.WalkFn) error {
|
func (d *driver) Walk(ctx context.Context, path string, f storagedriver.WalkFn, options ...func(*storagedriver.WalkOptions)) error {
|
||||||
return storagedriver.WalkFallback(ctx, d, path, f)
|
return storagedriver.WalkFallback(ctx, d, path, f, options...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func startSession(client *http.Client, bucket string, name string) (uri string, err error) {
|
func startSession(client *http.Client, bucket string, name string) (uri string, err error) {
|
||||||
|
|
|
@ -244,15 +244,8 @@ func (d *driver) URLFor(ctx context.Context, path string, options map[string]int
|
||||||
|
|
||||||
// Walk traverses a filesystem defined within driver, starting
|
// Walk traverses a filesystem defined within driver, starting
|
||||||
// from the given path, calling f on each file and directory
|
// from the given path, calling f on each file and directory
|
||||||
func (d *driver) Walk(ctx context.Context, path string, f storagedriver.WalkFn) error {
|
func (d *driver) Walk(ctx context.Context, path string, f storagedriver.WalkFn, options ...func(*storagedriver.WalkOptions)) error {
|
||||||
return storagedriver.WalkFallback(ctx, d, path, f)
|
return storagedriver.WalkFallback(ctx, d, path, f, options...)
|
||||||
}
|
|
||||||
|
|
||||||
// WalkWithStartAfterHint traverses a filesystem defined within driver, starting
|
|
||||||
// from the given path, calling f on each file and directory. The hint is ignored
|
|
||||||
// because it is not yet implemented.
|
|
||||||
func (d *driver) WalkWithStartAfterHint(ctx context.Context, path string, _ string, f storagedriver.WalkFn) error {
|
|
||||||
return d.Walk(ctx, path, f)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type writer struct {
|
type writer struct {
|
||||||
|
|
|
@ -1038,15 +1038,12 @@ func (d *driver) URLFor(ctx context.Context, path string, options map[string]int
|
||||||
|
|
||||||
// Walk traverses a filesystem defined within driver, starting
|
// Walk traverses a filesystem defined within driver, starting
|
||||||
// from the given path, calling f on each file
|
// from the given path, calling f on each file
|
||||||
func (d *driver) Walk(ctx context.Context, from string, f storagedriver.WalkFn) error {
|
func (d *driver) Walk(ctx context.Context, from string, f storagedriver.WalkFn, options ...func(*storagedriver.WalkOptions)) error {
|
||||||
return d.WalkWithStartAfterHint(ctx, from, "", f)
|
walkOptions := &storagedriver.WalkOptions{}
|
||||||
}
|
for _, o := range options {
|
||||||
|
o(walkOptions)
|
||||||
|
}
|
||||||
|
|
||||||
// WalkWithStartAfterHint traverses a filesystem defined within driver, starting
|
|
||||||
// from the given path, calling f on each file and directory. The start after hint
|
|
||||||
// is passed to the ListObjectsV2 API so that AWS can pre-filter any paths that are
|
|
||||||
// lexographically before the last paged item.
|
|
||||||
func (d *driver) WalkWithStartAfterHint(ctx context.Context, from string, startAfterHint string, f storagedriver.WalkFn) error {
|
|
||||||
path := from
|
path := from
|
||||||
if !strings.HasSuffix(path, "/") {
|
if !strings.HasSuffix(path, "/") {
|
||||||
path = path + "/"
|
path = path + "/"
|
||||||
|
@ -1058,7 +1055,7 @@ func (d *driver) WalkWithStartAfterHint(ctx context.Context, from string, startA
|
||||||
}
|
}
|
||||||
|
|
||||||
var objectCount int64
|
var objectCount int64
|
||||||
if err := d.doWalk(ctx, &objectCount, d.s3Path(path), prefix, startAfterHint, f); err != nil {
|
if err := d.doWalk(ctx, &objectCount, d.s3Path(path), prefix, walkOptions.StartAfterHint, f); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,19 @@ func (version Version) Minor() uint {
|
||||||
// CurrentVersion is the current storage driver Version.
|
// CurrentVersion is the current storage driver Version.
|
||||||
const CurrentVersion Version = "0.1"
|
const CurrentVersion Version = "0.1"
|
||||||
|
|
||||||
|
// WalkOptions provides options to the walk function that may adjust its behaviour
|
||||||
|
type WalkOptions struct {
|
||||||
|
// If StartAfterHint is set, the walk may start with the first item lexographically
|
||||||
|
// after the hint, but it is not guaranteed and drivers may start the walk from the path.
|
||||||
|
StartAfterHint string
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithStartAfterHint(startAfterHint string) func(*WalkOptions) {
|
||||||
|
return func(s *WalkOptions) {
|
||||||
|
s.StartAfterHint = startAfterHint
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// StorageDriver defines methods that a Storage Driver must implement for a
|
// StorageDriver defines methods that a Storage Driver must implement for a
|
||||||
// filesystem-like key/value object storage. Storage Drivers are automatically
|
// filesystem-like key/value object storage. Storage Drivers are automatically
|
||||||
// registered via an internal registration mechanism, and generally created
|
// registered via an internal registration mechanism, and generally created
|
||||||
|
@ -90,12 +103,7 @@ type StorageDriver interface {
|
||||||
// to a directory, the directory will not be entered and Walk
|
// to a directory, the directory will not be entered and Walk
|
||||||
// will continue the traversal.
|
// will continue the traversal.
|
||||||
// If the returned error from the WalkFn is ErrFilledBuffer, processing stops.
|
// If the returned error from the WalkFn is ErrFilledBuffer, processing stops.
|
||||||
Walk(ctx context.Context, path string, f WalkFn) error
|
Walk(ctx context.Context, path string, f WalkFn, options ...func(*WalkOptions)) error
|
||||||
|
|
||||||
// WalkWithStartAfterHint traverses a filesystem defined within driver as in
|
|
||||||
// Walk. If startAfterHint is set, the walk may start with the first item lexographically
|
|
||||||
// after the hint, but it is not guaranteed and drivers may start the walk from the path.
|
|
||||||
WalkWithStartAfterHint(ctx context.Context, path string, startAfterHint string, f WalkFn) error
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// FileWriter provides an abstraction for an opened writable file-like object in
|
// FileWriter provides an abstraction for an opened writable file-like object in
|
||||||
|
|
|
@ -26,7 +26,8 @@ type WalkFn func(fileInfo FileInfo) error
|
||||||
// If the returned error from the WalkFn is ErrSkipDir and fileInfo refers
|
// If the returned error from the WalkFn is ErrSkipDir and fileInfo refers
|
||||||
// to a directory, the directory will not be entered and Walk
|
// to a directory, the directory will not be entered and Walk
|
||||||
// will continue the traversal. If fileInfo refers to a normal file, processing stops
|
// will continue the traversal. If fileInfo refers to a normal file, processing stops
|
||||||
func WalkFallback(ctx context.Context, driver StorageDriver, from string, f WalkFn) error {
|
func WalkFallback(ctx context.Context, driver StorageDriver, from string, f WalkFn, options ...func(*WalkOptions)) error {
|
||||||
|
// No options are supported by the fallback, can be dropped
|
||||||
_, err := doWalkFallback(ctx, driver, from, f)
|
_, err := doWalkFallback(ctx, driver, from, f)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue