docker: Extract extractLayerWorker()

Signed-off-by: Simarpreet Singh <simar@linux.com>
This commit is contained in:
Simarpreet Singh
2019-11-19 14:48:43 -08:00
parent 98341f1e9e
commit 971269bac8

View File

@@ -189,34 +189,14 @@ func (d DockerExtractor) Extract(ctx context.Context, imageName string, filename
return nil, err return nil, err
} }
ch := make(chan layer) layerCh := make(chan layer)
errCh := make(chan error) errCh := make(chan error)
var layerIDs []string var layerIDs []string
for _, ref := range m.Manifest.Layers { for _, ref := range m.Manifest.Layers {
layerIDs = append(layerIDs, string(ref.Digest)) layerIDs = append(layerIDs, string(ref.Digest))
go func(dig digest.Digest) { go func(dig digest.Digest) {
// Use cache d.extractLayerWorker(dig, r, ctx, image, errCh, layerCh)
rc := d.Cache.Get(string(dig))
if rc == nil {
// Download the layer.
rc, err = r.DownloadLayer(ctx, image.Path, dig)
if err != nil {
errCh <- xerrors.Errorf("failed to download the layer(%s): %w", dig, err)
return
}
rc, err = d.Cache.Set(string(dig), rc)
if err != nil {
log.Print(err)
}
}
gzipReader, err := gzip.NewReader(rc)
if err != nil {
errCh <- xerrors.Errorf("invalid gzip: %w", err)
return
}
ch <- layer{ID: dig, Content: gzipReader}
}(ref.Digest) }(ref.Digest)
} }
@@ -225,7 +205,7 @@ func (d DockerExtractor) Extract(ctx context.Context, imageName string, filename
for i := 0; i < len(m.Manifest.Layers); i++ { for i := 0; i < len(m.Manifest.Layers); i++ {
var l layer var l layer
select { select {
case l = <-ch: case l = <-layerCh:
case err := <-errCh: case err := <-errCh:
return nil, err return nil, err
case <-ctx.Done(): case <-ctx.Done():
@@ -262,6 +242,31 @@ func (d DockerExtractor) Extract(ctx context.Context, imageName string, filename
return fileMap, nil return fileMap, nil
} }
func (d DockerExtractor) extractLayerWorker(dig digest.Digest, r *registry.Registry, ctx context.Context, image registry.Image, errCh chan error, layerCh chan layer) {
var rc io.Reader
// Use cache
rc = d.Cache.Get(string(dig))
if rc == nil {
// Download the layer.
layerRC, err := r.DownloadLayer(ctx, image.Path, dig)
if err != nil {
errCh <- xerrors.Errorf("failed to download the layer(%s): %w", dig, err)
return
}
rc, err = d.Cache.Set(string(dig), layerRC)
if err != nil {
log.Print(err)
}
}
gzipReader, err := gzip.NewReader(rc)
if err != nil {
errCh <- xerrors.Errorf("invalid gzip: %w", err)
return
}
layerCh <- layer{ID: dig, Content: gzipReader}
}
func getValidManifest(err error, r *registry.Registry, ctx context.Context, image registry.Image) (*schema2.DeserializedManifest, error) { func getValidManifest(err error, r *registry.Registry, ctx context.Context, image registry.Image) (*schema2.DeserializedManifest, error) {
manifest, err := r.Manifest(ctx, image.Path, image.Reference()) manifest, err := r.Manifest(ctx, image.Path, image.Reference())
if err != nil { if err != nil {