[lxc-devel] [lxd/master] Split autoUpdateImage function

albertodonato on Github lxc-bot at linuxcontainers.org
Fri May 5 11:21:16 UTC 2017


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 398 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20170505/bb864f5c/attachment.bin>
-------------- next part --------------
From 7bb3b558ae8ee8b4a7c35b0f72e562ec198e12b4 Mon Sep 17 00:00:00 2001
From: Alberto Donato <alberto.donato at canonical.com>
Date: Fri, 5 May 2017 12:49:38 +0200
Subject: [PATCH] Split autoUpdateImage function.

Signed-off-by: Alberto Donato <alberto.donato at canonical.com>
---
 lxd/images.go | 158 +++++++++++++++++++++++++++++++---------------------------
 1 file changed, 84 insertions(+), 74 deletions(-)

diff --git a/lxd/images.go b/lxd/images.go
index 1bcd5d9..5e47e30 100644
--- a/lxd/images.go
+++ b/lxd/images.go
@@ -880,10 +880,10 @@ func autoUpdateImages(d *Daemon) {
 		return
 	}
 
-	for _, fp := range images {
-		id, info, err := dbImageGet(d.db, fp, false, true)
+	for _, fingerprint := range images {
+		id, info, err := dbImageGet(d.db, fingerprint, false, true)
 		if err != nil {
-			logger.Error("Error loading image", log.Ctx{"err": err, "fp": fp})
+			logger.Error("Error loading image", log.Ctx{"err": err, "fp": fingerprint})
 			continue
 		}
 
@@ -891,100 +891,110 @@ func autoUpdateImages(d *Daemon) {
 			continue
 		}
 
-		_, source, err := dbImageSourceGet(d.db, id)
+		autoUpdateImage(d, fingerprint, id, info)
+	}
+
+	logger.Infof("Done updating images")
+}
+
+// Update a single image
+func autoUpdateImage(d *Daemon, fingerprint string, id int, info *api.Image) {
+	_, source, err := dbImageSourceGet(d.db, id)
+	if err != nil {
+		logger.Error("Error getting source image", log.Ctx{"err": err, "fp": fingerprint})
+		return
+	}
+
+	// Get the IDs of all storage pools on which a storage volume
+	// for the requested image currently exists.
+	poolIDs, err := dbImageGetPools(d.db, fingerprint)
+	if err != nil {
+		logger.Error("Error getting image pools", log.Ctx{"err": err, "fp": fingerprint})
+		return
+	}
+
+	// Translate the IDs to poolNames.
+	poolNames, err := dbImageGetPoolNamesFromIDs(d.db, poolIDs)
+	if err != nil {
+		logger.Error("Error getting image pools", log.Ctx{"err": err, "fp": fingerprint})
+		return
+	}
+
+	// If no optimized pools at least update the base store
+	if len(poolNames) == 0 {
+		poolNames = append(poolNames, "")
+	}
+
+	logger.Debug("Processing image", log.Ctx{"fp": fingerprint, "server": source.Server, "protocol": source.Protocol, "alias": source.Alias})
+
+	// Update the image on each pool where it currently exists.
+	hash := fingerprint
+	for _, poolName := range poolNames {
+		newInfo, err := d.ImageDownload(nil, source.Server, source.Protocol, "", "", source.Alias, false, true, poolName)
 		if err != nil {
+			logger.Error("Failed to update the image", log.Ctx{"err": err, "fp": fingerprint})
 			continue
 		}
 
-		// Get the IDs of all storage pools on which a storage volume
-		// for the requested image currently exists.
-		poolIDs, err := dbImageGetPools(d.db, fp)
-		if err != nil {
+		hash = newInfo.Fingerprint
+		if hash == fingerprint {
+			logger.Debug("Already up to date", log.Ctx{"fp": fingerprint})
 			continue
 		}
 
-		// Translate the IDs to poolNames.
-		poolNames, err := dbImageGetPoolNamesFromIDs(d.db, poolIDs)
+		newId, _, err := dbImageGet(d.db, hash, false, true)
 		if err != nil {
+			logger.Error("Error loading image", log.Ctx{"err": err, "fp": hash})
 			continue
 		}
 
-		// If no optimized pools at least update the base store
-		if len(poolNames) == 0 {
-			poolNames = append(poolNames, "")
-		}
-
-		logger.Debug("Processing image", log.Ctx{"fp": fp, "server": source.Server, "protocol": source.Protocol, "alias": source.Alias})
-
-		// Update the image on each pool where it currently exists.
-		hash := fp
-		for _, poolName := range poolNames {
-			newInfo, err := d.ImageDownload(nil, source.Server, source.Protocol, "", "", source.Alias, false, true, poolName)
-			if err != nil {
-				logger.Error("Failed to update the image", log.Ctx{"err": err, "fp": fp})
-				continue
-			}
-
-			hash = newInfo.Fingerprint
-			if hash == fp {
-				logger.Debug("Already up to date", log.Ctx{"fp": fp})
-				continue
-			}
-
-			newId, _, err := dbImageGet(d.db, hash, false, true)
-			if err != nil {
-				logger.Error("Error loading image", log.Ctx{"err": err, "fp": hash})
-				continue
-			}
-
-			err = dbImageLastAccessUpdate(d.db, hash, info.LastUsedAt)
-			if err != nil {
-				logger.Error("Error setting last use date", log.Ctx{"err": err, "fp": hash})
-				continue
-			}
-
-			err = dbImageAliasesMove(d.db, id, newId)
-			if err != nil {
-				logger.Error("Error moving aliases", log.Ctx{"err": err, "fp": hash})
-				continue
-			}
-
-			err = doDeleteImageFromPool(d, fp, poolName)
-			if err != nil {
-				logger.Error("Error deleting image", log.Ctx{"err": err, "fp": fp})
-			}
+		err = dbImageLastAccessUpdate(d.db, hash, info.LastUsedAt)
+		if err != nil {
+			logger.Error("Error setting last use date", log.Ctx{"err": err, "fp": hash})
+			continue
 		}
 
-		// Image didn't change, move on
-		if hash == fp {
+		err = dbImageAliasesMove(d.db, id, newId)
+		if err != nil {
+			logger.Error("Error moving aliases", log.Ctx{"err": err, "fp": hash})
 			continue
 		}
 
-		// Remove main image file.
-		fname := shared.VarPath("images", fp)
-		if shared.PathExists(fname) {
-			err = os.Remove(fname)
-			if err != nil {
-				logger.Debugf("Error deleting image file %s: %s", fname, err)
-			}
+		err = doDeleteImageFromPool(d, fingerprint, poolName)
+		if err != nil {
+			logger.Error("Error deleting image", log.Ctx{"err": err, "fp": fingerprint})
 		}
+	}
 
-		// Remove the rootfs file for the image.
-		fname = shared.VarPath("images", fp) + ".rootfs"
-		if shared.PathExists(fname) {
-			err = os.Remove(fname)
-			if err != nil {
-				logger.Debugf("Error deleting image file %s: %s", fname, err)
-			}
+	// Image didn't change, nothing to do.
+	if hash == fingerprint {
+		return
+	}
+
+	// Remove main image file.
+	fname := shared.VarPath("images", fingerprint)
+	if shared.PathExists(fname) {
+		err = os.Remove(fname)
+		if err != nil {
+			logger.Debugf("Error deleting image file %s: %s", fname, err)
 		}
+	}
 
-		// Remove the database entry for the image.
-		if err = dbImageDelete(d.db, id); err != nil {
-			logger.Debugf("Error deleting image from database %s: %s", fname, err)
+	// Remove the rootfs file for the image.
+	fname = shared.VarPath("images", fingerprint) + ".rootfs"
+	if shared.PathExists(fname) {
+		err = os.Remove(fname)
+		if err != nil {
+			logger.Debugf("Error deleting image file %s: %s", fname, err)
 		}
 	}
 
-	logger.Infof("Done updating images")
+	// Remove the database entry for the image.
+	if err = dbImageDelete(d.db, id); err != nil {
+		logger.Debugf("Error deleting image from database %s: %s", fname, err)
+	}
+
+	return
 }
 
 func pruneExpiredImages(d *Daemon) {


More information about the lxc-devel mailing list