From 735206e7dda80ccf4368b1509223bf9b5f35bff2 Mon Sep 17 00:00:00 2001 From: John Starks Date: Fri, 24 Jun 2016 15:15:59 -0700 Subject: [PATCH] Report load progress on compressed layer size When calling docker load on an image tar containing a compressed layer, apply NewProgressReader to the compressed layer (whose size is known), not the uncompressed stream. This fixes progress reporting to the client in this case. Signed-off-by: John Starks Upstream-commit: 5fd8edec1c3fff52eebe2d62694c93141d8756ba Component: engine --- components/engine/image/tarexport/load.go | 25 ++++++++++------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/components/engine/image/tarexport/load.go b/components/engine/image/tarexport/load.go index 59a499d6e3..ff42db53fb 100644 --- a/components/engine/image/tarexport/load.go +++ b/components/engine/image/tarexport/load.go @@ -170,28 +170,25 @@ func (l *tarexporter) loadLayer(filename string, rootFS image.RootFS, id string, } defer rawTar.Close() - inflatedLayerData, err := archive.DecompressStream(rawTar) - if err != nil { - return nil, err - } - defer inflatedLayerData.Close() - + var r io.Reader if progressOutput != nil { - fileInfo, err := os.Stat(filename) + fileInfo, err := rawTar.Stat() if err != nil { logrus.Debugf("Error statting file: %v", err) return nil, err } - progressReader := progress.NewProgressReader(inflatedLayerData, progressOutput, fileInfo.Size(), stringid.TruncateID(id), "Loading layer") - - if ds, ok := l.ls.(layer.DescribableStore); ok { - return ds.RegisterWithDescriptor(progressReader, rootFS.ChainID(), foreignSrc) - } - return l.ls.Register(progressReader, rootFS.ChainID()) - + r = progress.NewProgressReader(rawTar, progressOutput, fileInfo.Size(), stringid.TruncateID(id), "Loading layer") + } else { + r = rawTar } + inflatedLayerData, err := archive.DecompressStream(r) + if err != nil { + return nil, err + } + defer inflatedLayerData.Close() + if ds, ok := l.ls.(layer.DescribableStore); ok { return ds.RegisterWithDescriptor(inflatedLayerData, rootFS.ChainID(), foreignSrc) }