From c43f53025282aa7be730008c65c824de364d023f Mon Sep 17 00:00:00 2001 From: Derek McGowan Date: Wed, 21 Jan 2015 09:44:24 -0800 Subject: [PATCH 1/2] Fix write after close on http response Signed-off-by: Derek McGowan (github: dmcgowan) Upstream-commit: 12d83e727dd3522006b53afbcfac3cdce178117a Component: engine --- components/engine/engine/streams.go | 1 + components/engine/registry/session_v2.go | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/components/engine/engine/streams.go b/components/engine/engine/streams.go index 99e876e17b..ec703c96fa 100644 --- a/components/engine/engine/streams.go +++ b/components/engine/engine/streams.go @@ -111,6 +111,7 @@ func (o *Output) Close() error { } } o.tasks.Wait() + o.dests = nil return firstErr } diff --git a/components/engine/registry/session_v2.go b/components/engine/registry/session_v2.go index 11b96bd65a..fa02bd3e6c 100644 --- a/components/engine/registry/session_v2.go +++ b/components/engine/registry/session_v2.go @@ -226,7 +226,7 @@ func (r *Session) PutV2ImageBlob(ep *Endpoint, imageName, sumType, sumStr string method := "PUT" log.Debugf("[registry] Calling %q %s", method, location) - req, err = r.reqFactory.NewRequest(method, location, blobRdr) + req, err = r.reqFactory.NewRequest(method, location, ioutil.NopCloser(blobRdr)) if err != nil { return err } From bde8dbe0df16f995c275dbeed27ff4b36115c8ea Mon Sep 17 00:00:00 2001 From: Stephen J Day Date: Wed, 21 Jan 2015 14:16:39 -0800 Subject: [PATCH 2/2] Ensure that progress reader is closed after usage Signed-off-by: Stephen J Day Upstream-commit: 4e4a5b25328566efad9ade3e7e0737ba48c090ab Component: engine --- components/engine/graph/push.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/components/engine/graph/push.go b/components/engine/graph/push.go index 316eed91be..b8fb09882e 100644 --- a/components/engine/graph/push.go +++ b/components/engine/graph/push.go @@ -236,7 +236,10 @@ func (s *TagStore) pushImage(r *registry.Session, out io.Writer, imgID, ep strin // Send the layer log.Debugf("rendered layer for %s of [%d] size", imgData.ID, layerData.Size) - checksum, checksumPayload, err := r.PushImageLayerRegistry(imgData.ID, utils.ProgressReader(layerData, int(layerData.Size), out, sf, false, utils.TruncateID(imgData.ID), "Pushing"), ep, token, jsonRaw) + prgRd := utils.ProgressReader(layerData, int(layerData.Size), out, sf, false, utils.TruncateID(imgData.ID), "Pushing") + defer prgRd.Close() + + checksum, checksumPayload, err := r.PushImageLayerRegistry(imgData.ID, prgRd, ep, token, jsonRaw) if err != nil { return "", err } @@ -338,8 +341,12 @@ func (s *TagStore) pushV2Repository(r *registry.Session, eng *engine.Engine, out out.Write(sf.FormatProgress(utils.TruncateID(img.ID), "Image push failed", nil)) return err } + if !exists { - err = r.PutV2ImageBlob(endpoint, repoInfo.RemoteName, sumParts[0], manifestSum, utils.ProgressReader(arch, int(img.Size), out, sf, false, utils.TruncateID(img.ID), "Pushing"), auth) + prgRd := utils.ProgressReader(arch, int(img.Size), out, sf, false, utils.TruncateID(img.ID), "Pushing") + defer prgRd.Close() + + err = r.PutV2ImageBlob(endpoint, repoInfo.RemoteName, sumParts[0], manifestSum, prgRd, auth) if err != nil { out.Write(sf.FormatProgress(utils.TruncateID(img.ID), "Image push failed", nil)) return err