Skip to content
This repository was archived by the owner on Mar 27, 2024. It is now read-only.

Commit cc3dca6

Browse files
committed
implement layer caching
1 parent 3017d53 commit cc3dca6

File tree

2 files changed

+52
-25
lines changed

2 files changed

+52
-25
lines changed

cmd/root.go

Lines changed: 47 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"path/filepath"
2626
"sort"
2727
"strings"
28+
"time"
2829

2930
"github.com/google/go-containerregistry/authn"
3031
"github.com/google/go-containerregistry/name"
@@ -129,14 +130,17 @@ func checkIfValidAnalyzer(_ []string) error {
129130
}
130131

131132
func getImageForName(imageName string) (pkgutil.Image, error) {
132-
logrus.Infof("getting image for name %s", imageName)
133+
logrus.Infof("retrieving image: %s", imageName)
133134
var img v1.Image
134135
var err error
135136
if pkgutil.IsTar(imageName) {
137+
start := time.Now()
136138
img, err = tarball.ImageFromPath(imageName, nil)
137139
if err != nil {
138140
return pkgutil.Image{}, err
139141
}
142+
elapsed := time.Now().Sub(start)
143+
logrus.Infof("retrieving image from tar took %f seconds", elapsed.Seconds())
140144
}
141145

142146
if strings.HasPrefix(imageName, DaemonPrefix) {
@@ -148,10 +152,15 @@ func getImageForName(imageName string) (pkgutil.Image, error) {
148152
return pkgutil.Image{}, err
149153
}
150154

151-
img, err = daemon.Image(ref, &daemon.ReadOptions{})
155+
start := time.Now()
156+
img, err = daemon.Image(ref, &daemon.ReadOptions{
157+
Buffer: true,
158+
})
152159
if err != nil {
153160
return pkgutil.Image{}, err
154161
}
162+
elapsed := time.Now().Sub(start)
163+
logrus.Infof("retrieving image from daemon took %f seconds", elapsed.Seconds())
155164
} else {
156165
// either has remote prefix or has no prefix, in which case we force remote
157166
imageName = strings.Replace(imageName, RemotePrefix, "", -1)
@@ -163,21 +172,28 @@ func getImageForName(imageName string) (pkgutil.Image, error) {
163172
if err != nil {
164173
return pkgutil.Image{}, err
165174
}
175+
start := time.Now()
166176
img, err = remote.Image(ref, auth, http.DefaultTransport)
167177
if err != nil {
168178
return pkgutil.Image{}, err
169179
}
180+
elapsed := time.Now().Sub(start)
181+
logrus.Infof("retrieving remote image took %f seconds", elapsed.Seconds())
170182
}
171183

172184
// create tempdir and extract fs into it
173185
var layers []pkgutil.Layer
174186
if includeLayers() {
187+
start := time.Now()
175188
imgLayers, err := img.Layers()
176189
if err != nil {
177190
return pkgutil.Image{}, err
178191
}
179192
for _, layer := range imgLayers {
180-
path, err := ioutil.TempDir("", strings.Replace(imageName, "/", "", -1))
193+
layerStart := time.Now()
194+
diffID, err := layer.DiffID()
195+
logrus.Infof("layer digest: %s", diffID.String())
196+
path, err := getExtractPathForName(diffID.String())
181197
if err != nil {
182198
return pkgutil.Image{
183199
Layers: layers,
@@ -191,43 +207,53 @@ func getImageForName(imageName string) (pkgutil.Image, error) {
191207
layers = append(layers, pkgutil.Layer{
192208
FSPath: path,
193209
})
210+
elapsed := time.Now().Sub(layerStart)
211+
logrus.Infof("time elapsed retrieving layer: %fs", elapsed.Seconds())
194212
}
213+
elapsed := time.Now().Sub(start)
214+
logrus.Infof("time elapsed retrieving image layers: %fs", elapsed.Seconds())
195215
}
196216

217+
path, err := getExtractPathForName(imageName)
218+
// extract fs into provided dir
219+
if err := pkgutil.GetFileSystemForImage(img, path, nil); err != nil {
220+
return pkgutil.Image{
221+
FSPath: path,
222+
Layers: layers,
223+
}, err
224+
}
225+
return pkgutil.Image{
226+
Image: img,
227+
Source: imageName,
228+
FSPath: path,
229+
Layers: layers,
230+
}, nil
231+
}
232+
233+
func getExtractPathForName(name string) (string, error) {
197234
var path string
235+
var err error
198236
if !noCache {
199-
path, err = cacheDir(imageName)
237+
path, err = cacheDir(name)
200238
if err != nil {
201-
return pkgutil.Image{}, err
239+
return "", err
202240
}
203241
// if cachedir doesn't exist, create it
204242
if _, err := os.Stat(path); err != nil && os.IsNotExist(err) {
205243
err = os.MkdirAll(path, 0700)
206244
if err != nil {
207-
return pkgutil.Image{}, err
245+
return "", err
208246
}
209247
logrus.Infof("Image fs cached at %s", path)
210248
}
211249
} else {
212250
// otherwise, create tempdir
213-
path, err = ioutil.TempDir("", strings.Replace(imageName, "/", "", -1))
251+
path, err = ioutil.TempDir("", strings.Replace(name, "/", "", -1))
214252
if err != nil {
215-
return pkgutil.Image{}, err
253+
return "", err
216254
}
217255
}
218-
// extract fs into provided dir
219-
if err := pkgutil.GetFileSystemForImage(img, path, nil); err != nil {
220-
return pkgutil.Image{
221-
FSPath: path,
222-
Layers: layers,
223-
}, err
224-
}
225-
return pkgutil.Image{
226-
Image: img,
227-
Source: imageName,
228-
FSPath: path,
229-
Layers: layers,
230-
}, nil
256+
return path, nil
231257
}
232258

233259
func includeLayers() bool {

pkg/util/tar_utils.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,16 +83,17 @@ func unpackTar(tr *tar.Reader, path string, whitelist []string) error {
8383
// It's possible for a file to be included before the directory it's in is created.
8484
baseDir := filepath.Dir(target)
8585
if _, err := os.Stat(baseDir); os.IsNotExist(err) {
86-
logrus.Debugf("baseDir %s for file %s does not exist. Creating.", baseDir, target)
86+
logrus.Debugf("baseDir %s for file %s does not exist. Creating", baseDir, target)
8787
if err := os.MkdirAll(baseDir, 0755); err != nil {
8888
return err
8989
}
9090
}
9191
// It's possible we end up creating files that can't be overwritten based on their permissions.
9292
// Explicitly delete an existing file before continuing.
9393
if _, err := os.Stat(target); !os.IsNotExist(err) {
94-
logrus.Debugf("Removing %s for overwrite.", target)
94+
logrus.Debugf("Removing %s for overwrite", target)
9595
if err := os.Remove(target); err != nil {
96+
logrus.Errorf("error removing file %s", target)
9697
return err
9798
}
9899
}
@@ -117,7 +118,7 @@ func unpackTar(tr *tar.Reader, path string, whitelist []string) error {
117118
// It's possible we end up creating files that can't be overwritten based on their permissions.
118119
// Explicitly delete an existing file before continuing.
119120
if _, err := os.Stat(target); !os.IsNotExist(err) {
120-
logrus.Debugf("Removing %s to create symlink.", target)
121+
logrus.Debugf("Removing %s to create symlink", target)
121122
if err := os.RemoveAll(target); err != nil {
122123
logrus.Debugf("Unable to remove %s: %s", target, err)
123124
}
@@ -139,7 +140,7 @@ func unpackTar(tr *tar.Reader, path string, whitelist []string) error {
139140
}
140141

141142
for target, linkname := range hardlinks {
142-
logrus.Info("Resolving hard links.")
143+
logrus.Info("Resolving hard links")
143144
if _, err := os.Stat(linkname); !os.IsNotExist(err) {
144145
// If it exists, create the hard link
145146
if err := resolveHardlink(linkname, target); err != nil {

0 commit comments

Comments
 (0)