cache/filecache: Use time.Duration for maxAge

Fixes #5438
This commit is contained in:
Bjørn Erik Pedersen 2018-11-14 10:51:41 +01:00
parent 17d7ecde2b
commit d3489eba5d
No known key found for this signature in database
GPG key ID: 330E6E2BD4859D8F
5 changed files with 31 additions and 19 deletions

View file

@ -36,8 +36,9 @@ import (
type Cache struct { type Cache struct {
Fs afero.Fs Fs afero.Fs
// Max age in seconds. // Max age for items in this cache. Negative duration means forever,
maxAge int // 0 is effectively turning this cache off.
maxAge time.Duration
nlocker *locker.Locker nlocker *locker.Locker
} }
@ -49,7 +50,7 @@ type ItemInfo struct {
} }
// NewCache creates a new file cache with the given filesystem and max age. // NewCache creates a new file cache with the given filesystem and max age.
func NewCache(fs afero.Fs, maxAge int) *Cache { func NewCache(fs afero.Fs, maxAge time.Duration) *Cache {
return &Cache{ return &Cache{
Fs: fs, Fs: fs,
nlocker: locker.NewLocker(), nlocker: locker.NewLocker(),
@ -227,9 +228,7 @@ func (c *Cache) getOrRemove(id string) hugio.ReadSeekCloser {
return nil return nil
} }
expiry := time.Now().Add(-time.Duration(c.maxAge) * time.Second) if time.Now().Sub(fi.ModTime()) > c.maxAge {
expired := fi.ModTime().Before(expiry)
if expired {
c.Fs.Remove(id) c.Fs.Remove(id)
return nil return nil
} }

View file

@ -17,6 +17,7 @@ import (
"path" "path"
"path/filepath" "path/filepath"
"strings" "strings"
"time"
"github.com/gohugoio/hugo/helpers" "github.com/gohugoio/hugo/helpers"
"github.com/gohugoio/hugo/hugolib/paths" "github.com/gohugoio/hugo/hugolib/paths"
@ -62,8 +63,8 @@ type cachesConfig map[string]cacheConfig
type cacheConfig struct { type cacheConfig struct {
// Max age of cache entries in this cache. Any items older than this will // Max age of cache entries in this cache. Any items older than this will
// be removed and not returned from the cache. // be removed and not returned from the cache.
// -1 means forever, 0 means cache is disabled. // a negative value means forever, 0 means cache is disabled.
MaxAge int MaxAge time.Duration
// The directory where files are stored. // The directory where files are stored.
Dir string Dir string
@ -107,7 +108,18 @@ func decodeConfig(p *paths.Paths) (cachesConfig, error) {
for k, v := range m { for k, v := range m {
cc := defaultCacheConfig cc := defaultCacheConfig
if err := mapstructure.WeakDecode(v, &cc); err != nil { dc := &mapstructure.DecoderConfig{
Result: &cc,
DecodeHook: mapstructure.StringToTimeDurationHookFunc(),
WeaklyTypedInput: true,
}
decoder, err := mapstructure.NewDecoder(dc)
if err != nil {
return c, err
}
if err := decoder.Decode(v); err != nil {
return nil, err return nil, err
} }

View file

@ -17,6 +17,7 @@ import (
"path/filepath" "path/filepath"
"runtime" "runtime"
"testing" "testing"
"time"
"github.com/gohugoio/hugo/config" "github.com/gohugoio/hugo/config"
"github.com/gohugoio/hugo/hugofs" "github.com/gohugoio/hugo/hugofs"
@ -34,10 +35,10 @@ func TestDecodeConfig(t *testing.T) {
configStr := ` configStr := `
[caches] [caches]
[caches.getJSON] [caches.getJSON]
maxAge = 1234 maxAge = "10m"
dir = "/path/to/c1" dir = "/path/to/c1"
[caches.getCSV] [caches.getCSV]
maxAge = 3456 maxAge = "11h"
dir = "/path/to/c2" dir = "/path/to/c2"
[caches.images] [caches.images]
dir = "/path/to/c3" dir = "/path/to/c3"
@ -56,11 +57,11 @@ dir = "/path/to/c3"
assert.Equal(4, len(decoded)) assert.Equal(4, len(decoded))
c2 := decoded["getcsv"] c2 := decoded["getcsv"]
assert.Equal(3456, c2.MaxAge) assert.Equal("11h0m0s", c2.MaxAge.String())
assert.Equal(filepath.FromSlash("/path/to/c2"), c2.Dir) assert.Equal(filepath.FromSlash("/path/to/c2"), c2.Dir)
c3 := decoded["images"] c3 := decoded["images"]
assert.Equal(-1, c3.MaxAge) assert.Equal(time.Duration(-1), c3.MaxAge)
assert.Equal(filepath.FromSlash("/path/to/c3"), c3.Dir) assert.Equal(filepath.FromSlash("/path/to/c3"), c3.Dir)
} }
@ -96,7 +97,7 @@ dir = "/path/to/c3"
assert.Equal(4, len(decoded)) assert.Equal(4, len(decoded))
for _, v := range decoded { for _, v := range decoded {
assert.Equal(0, v.MaxAge) assert.Equal(time.Duration(0), v.MaxAge)
} }
} }

View file

@ -44,7 +44,7 @@ func TestFileCache(t *testing.T) {
cacheDir = "CACHEDIR" cacheDir = "CACHEDIR"
[caches] [caches]
[caches.getJSON] [caches.getJSON]
maxAge = 111 maxAge = "10h"
dir = ":cacheDir/c" dir = ":cacheDir/c"
` `
@ -62,7 +62,7 @@ dir = ":cacheDir/c"
c := caches.Get("GetJSON") c := caches.Get("GetJSON")
assert.NotNil(c) assert.NotNil(c)
assert.Equal(111, c.maxAge) assert.Equal("10h0m0s", c.maxAge.String())
bfs, ok := c.Fs.(*afero.BasePathFs) bfs, ok := c.Fs.(*afero.BasePathFs)
assert.True(ok) assert.True(ok)
@ -151,7 +151,7 @@ func TestFileCacheConcurrent(t *testing.T) {
configStr := ` configStr := `
[caches] [caches]
[caches.getjson] [caches.getjson]
maxAge = 1 maxAge = "1s"
dir = "/cache/c" dir = "/cache/c"
` `

View file

@ -439,8 +439,8 @@ You can override any of these cache setting in your own `config.toml`.
: This is the value of the `resourceDir` config option. : This is the value of the `resourceDir` config option.
maxAge maxAge
: This is the time in seconds before a cache entry will be evicted, -1 means forever and 0 effectively turns that particular cache off. : This is the duration before a cache entry will be evicted, -1 means forever and 0 effectively turns that particular cache off. Uses Go's `time.Duration`, so valid values are `"10s"` (10 seconds), `"10m"` (10 minutes) and `"10m"` (10 hours).
dir dir
: The absolute path to where the files for this cache will be stored. Allowed starting placeholders are `:cacheDir` and `:resourceDir` (see above). : The absolute path to where the files for this cache will be stored. Allowed starting placeholders are `:cacheDir` and `:resourceDir` (see above).