Skip to content

Commit

Permalink
Lock on convert (#307)
Browse files Browse the repository at this point in the history
* Lock on convert

* Fix typo

* Should use debug for convert lock

* Bump to 0.10.5
  • Loading branch information
n0vad3v authored Dec 29, 2023
1 parent 484c876 commit d35e0e0
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 5 deletions.
3 changes: 2 additions & 1 deletion config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,9 @@ var (
ProxyMode bool
Prefetch bool
Config = NewWebPConfig()
Version = "0.10.4"
Version = "0.10.5"
WriteLock = cache.New(5*time.Minute, 10*time.Minute)
ConvertLock = cache.New(5*time.Minute, 10*time.Minute)
RemoteRaw = "./remote-raw"
Metadata = "./metadata"
LocalHostAlias = "local"
Expand Down
26 changes: 22 additions & 4 deletions encoder/encoder.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"runtime"
"strings"
"sync"
"time"
"webp_server_go/config"
"webp_server_go/helper"

Expand Down Expand Up @@ -33,7 +34,24 @@ func init() {
}

func ConvertFilter(rawPath, avifPath, webpPath string, extraParams config.ExtraParams, c chan int) {
// all absolute paths
// Wait for the conversion to complete and return the converted image
retryDelay := 100 * time.Millisecond // Initial retry delay

for {
if _, found := config.ConvertLock.Get(rawPath); found {
log.Debugf("file %s is locked under conversion, retrying in %s", rawPath, retryDelay)
time.Sleep(retryDelay)
} else {
// The lock is released, indicating that the conversion is complete
break
}
}

// If there is a lock here, it means that another thread is converting the same image
// Lock rawPath to prevent concurrent conversion
config.ConvertLock.Set(rawPath, true, -1)
defer config.ConvertLock.Delete(rawPath)

var wg sync.WaitGroup
wg.Add(2)
if !helper.ImageExists(avifPath) && config.Config.EnableAVIF {
Expand Down Expand Up @@ -77,9 +95,9 @@ func convertImage(rawPath, optimizedPath, imageType string, extraParams config.E
var convertedRaw, converted = ConvertRawToJPG(rawPath, optimizedPath)
// If converted, use converted file as raw
if converted {
// Use converted file(JPG) as raw input for further convertion
// Use converted file(JPG) as raw input for further conversion
rawPath = convertedRaw
// Remove converted file after convertion
// Remove converted file after conversion
defer func() {
log.Infoln("Removing intermediate conversion file:", convertedRaw)
err := os.Remove(convertedRaw)
Expand All @@ -105,6 +123,7 @@ func convertImage(rawPath, optimizedPath, imageType string, extraParams config.E
case "avif":
err = avifEncoder(img, rawPath, optimizedPath, extraParams)
}

return err
}

Expand Down Expand Up @@ -179,7 +198,6 @@ func webpEncoder(img *vips.ImageRef, rawPath string, optimizedPath string, extra
}
}
buf, _, err = img.ExportWebp(&ep)

}

if err != nil {
Expand Down

0 comments on commit d35e0e0

Please sign in to comment.