resource: Serialize image processing
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Fri, 26 Oct 2018 11:45:51 +0000 (13:45 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Fri, 26 Oct 2018 12:40:05 +0000 (14:40 +0200)
Fixes #5220

resource/image.go

index d9a1dd47dbd6612f9734cdaa39be8e0033a6b798..fc79cbef5c44a4e9b1d65d1ff97cf4fc8508fdd1 100644 (file)
@@ -212,6 +212,15 @@ func (i *Image) isJPEG() bool {
        return strings.HasSuffix(name, ".jpg") || strings.HasSuffix(name, ".jpeg")
 }
 
+// Serialize image processing. The imaging library spins up its own set of Go routines,
+// so there is not much to gain from adding more load to the mix. That
+// can even have negative effect in low resource scenarios.
+// Note that this only effects the non-cached scenario. Once the processed
+// image is written to disk, everything is fast, fast fast.
+const imageProcWorkers = 1
+
+var imageProcSem = make(chan bool, imageProcWorkers)
+
 func (i *Image) doWithImageConfig(action, spec string, f func(src image.Image, conf imageConfig) (image.Image, error)) (*Image, error) {
        conf, err := parseImageConfig(spec)
        if err != nil {
@@ -237,6 +246,11 @@ func (i *Image) doWithImageConfig(action, spec string, f func(src image.Image, c
        }
 
        return i.spec.imageCache.getOrCreate(i, conf, func(resourceCacheFilename string) (*Image, error) {
+               imageProcSem <- true
+               defer func() {
+                       <-imageProcSem
+               }()
+
                ci := i.clone()
 
                errOp := action