The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/7585
This e-mail was sent by the LXC bot, direct replies will not reach the author unless they happen to be subscribed to this list. === Description (from pull-request) === This will fix a hang we've seen on aarch64 when transferring a large-ish image between cluster nodes. Also in general, this will save potentially a LOT of memory when doing image exports.
From f895b0c937a27d27ac82cfd34492f4b0d0b09054 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Thu, 25 Jun 2020 17:02:39 -0400 Subject: [PATCH 1/2] client: Handle unknown image sizes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- client/lxd_images.go | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/client/lxd_images.go b/client/lxd_images.go index 0203b0ebbf..1d1932dcc3 100644 --- a/client/lxd_images.go +++ b/client/lxd_images.go @@ -180,15 +180,25 @@ func lxdDownloadImage(fingerprint string, uri string, userAgent string, client * // Handle the data body := response.Body if req.ProgressHandler != nil { - body = &ioprogress.ProgressReader{ + reader := &ioprogress.ProgressReader{ ReadCloser: response.Body, Tracker: &ioprogress.ProgressTracker{ Length: response.ContentLength, - Handler: func(percent int64, speed int64) { - req.ProgressHandler(ioprogress.ProgressData{Text: fmt.Sprintf("%d%% (%s/s)", percent, units.GetByteSizeString(speed, 2))}) - }, }, } + + if response.ContentLength > 0 { + reader.Tracker.Handler = func(percent int64, speed int64) { + req.ProgressHandler(ioprogress.ProgressData{Text: fmt.Sprintf("%d%% (%s/s)", percent, units.GetByteSizeString(speed, 2))}) + } + } else { + reader.Tracker.Handler = func(received int64, speed int64) { + req.ProgressHandler(ioprogress.ProgressData{Text: fmt.Sprintf("%s (%s/s)", units.GetByteSizeString(received, 2), units.GetByteSizeString(speed, 2))}) + + } + } + + body = reader } // Hashing From 6575b2dd9b9ec386b1ab12943fee513870f9dffe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Thu, 25 Jun 2020 17:02:59 -0400 Subject: [PATCH 2/2] lxd/response: Stream multi-part responses MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- lxd/response/response.go | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/lxd/response/response.go b/lxd/response/response.go index 5270c489f3..302c4eae09 100644 --- a/lxd/response/response.go +++ b/lxd/response/response.go @@ -301,9 +301,12 @@ func (r *fileResponse) Render(w http.ResponseWriter) error { return nil } - // Now the complex multipart answer - body := &bytes.Buffer{} - mw := multipart.NewWriter(body) + // Now the complex multipart answer. + mw := multipart.NewWriter(w) + defer mw.Close() + + w.Header().Set("Content-Type", mw.FormDataContentType()) + w.Header().Set("Transfer-Encoding", "chunked") for _, entry := range r.files { var rd io.Reader @@ -329,13 +332,8 @@ func (r *fileResponse) Render(w http.ResponseWriter) error { return err } } - mw.Close() - - w.Header().Set("Content-Type", mw.FormDataContentType()) - w.Header().Set("Content-Length", fmt.Sprintf("%d", body.Len())) - _, err := io.Copy(w, body) - return err + return nil } func (r *fileResponse) String() string {
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel