[lxc-devel] [lxd/master] lxd/images: Don't keep an in-memory simplestreams cache
stgraber on Github
lxc-bot at linuxcontainers.org
Tue Apr 2 02:10:44 UTC 2019
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 354 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20190401/60a12ff1/attachment-0001.bin>
-------------- next part --------------
From c68f65ee69b92c45facee90bb96cfea608cdc88f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Mon, 1 Apr 2019 22:04:58 -0400
Subject: [PATCH] lxd/images: Don't keep an in-memory simplestreams cache
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxd/daemon.go | 10 ---------
lxd/daemon_config.go | 7 ------
lxd/daemon_images.go | 53 +++++++++++++++++++++-----------------------
3 files changed, 25 insertions(+), 45 deletions(-)
diff --git a/lxd/daemon.go b/lxd/daemon.go
index 8aabd26614..23a8fd8fb4 100644
--- a/lxd/daemon.go
+++ b/lxd/daemon.go
@@ -715,12 +715,6 @@ func (d *Daemon) init() error {
return err
}
- /* Restore simplestreams cache */
- err = imageLoadStreamCache(d)
- if err != nil {
- return err
- }
-
// Cleanup leftover images
pruneLeftoverImages(d)
@@ -994,10 +988,6 @@ func (d *Daemon) Stop() error {
"Not unmounting temporary filesystems (containers are still running)")
}
- logger.Infof("Saving simplestreams cache")
- trackError(imageSaveStreamCache(d.os))
- logger.Infof("Saved simplestreams cache")
-
var err error
if n := len(errs); n > 0 {
format := "%v"
diff --git a/lxd/daemon_config.go b/lxd/daemon_config.go
index a3f9a63480..57b6f04533 100644
--- a/lxd/daemon_config.go
+++ b/lxd/daemon_config.go
@@ -50,11 +50,4 @@ func daemonConfigSetProxy(d *Daemon, config *cluster.Config) {
config.ProxyHTTP(),
config.ProxyIgnoreHosts(),
)
-
- // Clear the simplestreams cache as it's tied to the old proxy config
- imageStreamCacheLock.Lock()
- for k := range imageStreamCache {
- delete(imageStreamCache, k)
- }
- imageStreamCacheLock.Unlock()
}
diff --git a/lxd/daemon_images.go b/lxd/daemon_images.go
index 3a3b22eff0..0344436a64 100644
--- a/lxd/daemon_images.go
+++ b/lxd/daemon_images.go
@@ -36,16 +36,14 @@ type imageStreamCacheEntry struct {
Fingerprints []string `yaml:"fingerprints"`
expiry time.Time
- remote lxd.ImageServer
}
-var imageStreamCache = map[string]*imageStreamCacheEntry{}
var imageStreamCacheLock sync.Mutex
var imagesDownloading = map[string]chan bool{}
var imagesDownloadingLock sync.Mutex
-func imageSaveStreamCache(os *sys.OS) error {
+func imageSaveStreamCache(os *sys.OS, imageStreamCache map[string]*imageStreamCacheEntry) error {
data, err := yaml.Marshal(&imageStreamCache)
if err != nil {
return err
@@ -59,41 +57,25 @@ func imageSaveStreamCache(os *sys.OS) error {
return nil
}
-func imageLoadStreamCache(d *Daemon) error {
- imageStreamCacheLock.Lock()
- defer imageStreamCacheLock.Unlock()
+func imageGetStreamCache(d *Daemon) (map[string]*imageStreamCacheEntry, error) {
+ imageStreamCache := map[string]*imageStreamCacheEntry{}
simplestreamsPath := filepath.Join(d.os.CacheDir, "simplestreams.yaml")
if !shared.PathExists(simplestreamsPath) {
- return nil
+ return imageStreamCache, nil
}
content, err := ioutil.ReadFile(simplestreamsPath)
if err != nil {
- return err
+ return nil, err
}
err = yaml.Unmarshal(content, imageStreamCache)
if err != nil {
- return err
- }
-
- for url, entry := range imageStreamCache {
- if entry.remote == nil {
- remote, err := lxd.ConnectSimpleStreams(url, &lxd.ConnectionArgs{
- TLSServerCert: entry.Certificate,
- UserAgent: version.UserAgent,
- Proxy: d.proxy,
- })
- if err != nil {
- continue
- }
-
- entry.remote = remote
- }
+ return nil, err
}
- return nil
+ return imageStreamCache, nil
}
// ImageDownload resolves the image fingerprint and if not in the database, downloads it
@@ -115,6 +97,12 @@ func (d *Daemon) ImageDownload(op *operation, server string, protocol string, ce
// Attempt to resolve the alias
if protocol == "simplestreams" {
imageStreamCacheLock.Lock()
+ imageStreamCache, err := imageGetStreamCache(d)
+ if err != nil {
+ imageStreamCacheLock.Unlock()
+ return nil, err
+ }
+
entry, _ := imageStreamCache[server]
if entry == nil || entry.expiry.Before(time.Now()) {
// Add a new entry to the cache
@@ -147,9 +135,9 @@ func (d *Daemon) ImageDownload(op *operation, server string, protocol string, ce
}
// Generate cache entry
- entry = &imageStreamCacheEntry{remote: remote, Aliases: aliases, Certificate: certificate, Fingerprints: fingerprints, expiry: time.Now().Add(time.Hour)}
+ entry = &imageStreamCacheEntry{Aliases: aliases, Certificate: certificate, Fingerprints: fingerprints, expiry: time.Now().Add(time.Hour)}
imageStreamCache[server] = entry
- imageSaveStreamCache(d.os)
+ imageSaveStreamCache(d.os, imageStreamCache)
return entry, nil
}
@@ -170,7 +158,16 @@ func (d *Daemon) ImageDownload(op *operation, server string, protocol string, ce
} else {
// use the existing entry
logger.Debug("Using SimpleStreams cache entry", log.Ctx{"server": server, "expiry": entry.expiry})
- remote = entry.remote
+
+ remote, err = lxd.ConnectSimpleStreams(server, &lxd.ConnectionArgs{
+ TLSServerCert: entry.Certificate,
+ UserAgent: version.UserAgent,
+ Proxy: d.proxy,
+ })
+ if err != nil {
+ imageStreamCacheLock.Unlock()
+ return nil, err
+ }
}
imageStreamCacheLock.Unlock()
More information about the lxc-devel
mailing list