diff --git a/registry/storage/driver/s3-aws/s3.go b/registry/storage/driver/s3-aws/s3.go index 48db5f4a199..11822a0b23d 100644 --- a/registry/storage/driver/s3-aws/s3.go +++ b/registry/storage/driver/s3-aws/s3.go @@ -1178,6 +1178,16 @@ func (d *driver) doWalk(parentCtx context.Context, objectCount *int64, from stri prevDir = dir } + // in some cases the _uploads dir might be empty. when this happens, it would + // be appended twice to the walkInfos slice, once as [...]/_uploads and + // once more erroneously as [...]/_uploads/. the easiest way to avoid this is + // to skip appending filePath to walkInfos if it ends in "/". the loop through + // dirs will already have handled it in that case, so it's safe to continue this + // loop. + if strings.HasSuffix(filePath, "/") { + continue + } + walkInfos = append(walkInfos, storagedriver.FileInfoInternal{ FileInfoFields: storagedriver.FileInfoFields{ IsDir: false, @@ -1541,6 +1551,7 @@ func (w *writer) Write(p []byte) (int, error) { func (w *writer) Size() int64 { return w.size } + func (w *writer) Close() error { if w.closed { return fmt.Errorf("already closed")