[lxc-devel] [lxd/master] Don't make unnecessary image copies

stgraber on Github lxc-bot at linuxcontainers.org
Mon Oct 17 20:50:09 UTC 2016


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 370 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20161017/15e9898c/attachment.bin>
-------------- next part --------------
From 36755bdbfae33e0a568e9d10e9b70169565c861c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Mon, 17 Oct 2016 16:47:32 -0400
Subject: [PATCH] Don't make unnecessary image copies
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Closes #2508

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxd/images.go | 23 +++++++++++------------
 1 file changed, 11 insertions(+), 12 deletions(-)

diff --git a/lxd/images.go b/lxd/images.go
index afaa514..daae70b 100644
--- a/lxd/images.go
+++ b/lxd/images.go
@@ -468,14 +468,14 @@ func getImgPostInfo(d *Daemon, r *http.Request,
 	sha256 := sha256.New()
 	var size int64
 
-	// Create a temporary file for the image tarball
-	imageTarf, err := ioutil.TempFile(builddir, "lxd_tar_")
-	if err != nil {
-		return info, err
-	}
-	defer os.Remove(imageTarf.Name())
-
 	if ctype == "multipart/form-data" {
+		// Create a temporary file for the image tarball
+		imageTarf, err := ioutil.TempFile(builddir, "lxd_tar_")
+		if err != nil {
+			return info, err
+		}
+		defer os.Remove(imageTarf.Name())
+
 		// Parse the POST data
 		post.Seek(0, 0)
 		mr := multipart.NewReader(post, ctypeParams["boundary"])
@@ -577,9 +577,8 @@ func getImgPostInfo(d *Daemon, r *http.Request,
 		}
 	} else {
 		post.Seek(0, 0)
-		size, err = io.Copy(io.MultiWriter(imageTarf, sha256), post)
+		size, err = io.Copy(sha256, post)
 		info.Size = size
-		imageTarf.Close()
 		logger.Debug("Tar size", log.Ctx{"size": size})
 		if err != nil {
 			logger.Error(
@@ -605,7 +604,7 @@ func getImgPostInfo(d *Daemon, r *http.Request,
 			return info, err
 		}
 
-		imageMeta, err = getImageMetadata(imageTarf.Name())
+		imageMeta, err = getImageMetadata(post.Name())
 		if err != nil {
 			logger.Error(
 				"Failed to get image metadata",
@@ -614,13 +613,13 @@ func getImgPostInfo(d *Daemon, r *http.Request,
 		}
 
 		imgfname := shared.VarPath("images", info.Fingerprint)
-		err = shared.FileMove(imageTarf.Name(), imgfname)
+		err = shared.FileMove(post.Name(), imgfname)
 		if err != nil {
 			logger.Error(
 				"Failed to move the tarfile",
 				log.Ctx{
 					"err":    err,
-					"source": imageTarf.Name(),
+					"source": post.Name(),
 					"dest":   imgfname})
 			return info, err
 		}


More information about the lxc-devel mailing list