[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