resources/images: Make the image cache more robust

Also allow timeout to be set as a duration string, e.g. `30s`.

Fixes #6501
This commit is contained in:
Bjørn Erik Pedersen
2019-11-25 12:49:04 +01:00
parent 031f948f87
commit d6f7a9e28d
11 changed files with 85 additions and 32 deletions

View File

@@ -88,7 +88,7 @@ func (i *imageResource) getExif() (*exif.Exif, error) {
key := i.getImageMetaCacheTargetPath()
read := func(info filecache.ItemInfo, r io.Reader) error {
read := func(info filecache.ItemInfo, r io.ReadSeeker) error {
meta := &imageMeta{}
data, err := ioutil.ReadAll(r)
if err != nil {

View File

@@ -96,12 +96,18 @@ func (c *imageCache) getOrCreate(
// These funcs are protected by a named lock.
// read clones the parent to its new name and copies
// the content to the destinations.
read := func(info filecache.ItemInfo, r io.Reader) error {
read := func(info filecache.ItemInfo, r io.ReadSeeker) error {
img = parent.clone(nil)
rp := img.getResourcePaths()
rp.relTargetDirFile.file = relTarget.file
img.setSourceFilename(info.Name)
if err := img.InitConfig(r); err != nil {
return err
}
r.Seek(0, 0)
w, err := img.openDestinationsForWriting()
if err != nil {
return err
@@ -114,6 +120,7 @@ func (c *imageCache) getOrCreate(
defer w.Close()
_, err = io.Copy(w, r)
return err
}

View File

@@ -123,6 +123,15 @@ func (i Image) WithSpec(s Spec) *Image {
return &i
}
// InitConfig reads the image config from the given reader.
func (i *Image) InitConfig(r io.Reader) error {
var err error
i.configInit.Do(func() {
i.config, _, err = image.DecodeConfig(r)
})
return err
}
func (i *Image) initConfig() error {
var err error
i.configInit.Do(func() {
@@ -130,10 +139,7 @@ func (i *Image) initConfig() error {
return
}
var (
f hugio.ReadSeekCloser
config image.Config
)
var f hugio.ReadSeekCloser
f, err = i.Spec.ReadSeekCloser()
if err != nil {
@@ -141,11 +147,7 @@ func (i *Image) initConfig() error {
}
defer f.Close()
config, _, err = image.DecodeConfig(f)
if err != nil {
return
}
i.config = config
i.config, _, err = image.DecodeConfig(f)
})
if err != nil {