Handle resource changes when the resources is already evicted from cache

Also fix a logical flaw in the cache resizer that made it too aggressive. After this I haven't been able to reproduce #11988, but I need to look closer.

Closes #11973
Updates #11988
This commit is contained in:
Bjørn Erik Pedersen
2024-02-02 11:20:08 +01:00
parent 53f204310e
commit 609d798e34
9 changed files with 136 additions and 24 deletions

View File

@@ -1018,14 +1018,6 @@ func (h *HugoSites) resolveAndClearStateForIdentities(
b = cachebuster(s)
}
if b {
identity.WalkIdentitiesShallow(v, func(level int, id identity.Identity) bool {
// Add them to the change set so we can reset any page that depends on them.
changes = append(changes, id)
return false
})
}
return b
}
@@ -1037,6 +1029,15 @@ func (h *HugoSites) resolveAndClearStateForIdentities(
}
}
// Drain the the cache eviction stack.
evicted := h.Deps.MemCache.DrainEvictedIdentities()
if len(evicted) < 200 {
changes = append(changes, evicted...)
} else {
// Mass eviction, we might as well invalidate everything.
changes = []identity.Identity{identity.GenghisKhan}
}
// Remove duplicates
seen := make(map[identity.Identity]bool)
var n int

View File

@@ -99,6 +99,8 @@ type HugoSites struct {
*fatalErrorHandler
*buildCounters
// Tracks invocations of the Build method.
buildCounter atomic.Uint64
}
// ShouldSkipFileChangeEvent allows skipping filesystem event early before
@@ -420,10 +422,9 @@ func (cfg *BuildCfg) shouldRender(p *pageState) bool {
return false
}
fastRenderMode := cfg.RecentlyVisited.Len() > 0
fastRenderMode := p.s.Conf.FastRenderMode()
if !fastRenderMode {
// Not in fast render mode or first time render.
if !fastRenderMode || p.s.h.buildCounter.Load() == 0 {
return shouldRender
}

View File

@@ -57,6 +57,9 @@ import (
func (h *HugoSites) Build(config BuildCfg, events ...fsnotify.Event) error {
infol := h.Log.InfoCommand("build")
defer loggers.TimeTrackf(infol, time.Now(), nil, "")
defer func() {
h.buildCounter.Add(1)
}()
if h.Deps == nil {
panic("must have deps")
@@ -769,8 +772,9 @@ func (h *HugoSites) processPartial(ctx context.Context, l logg.LevelLogger, conf
}
case files.ComponentFolderAssets:
logger.Println("Asset changed", pathInfo.Path())
r, _ := h.ResourceSpec.ResourceCache.Get(context.Background(), dynacache.CleanKey(pathInfo.Base()))
var hasID bool
r, _ := h.ResourceSpec.ResourceCache.Get(context.Background(), dynacache.CleanKey(pathInfo.Base()))
identity.WalkIdentitiesShallow(r, func(level int, rid identity.Identity) bool {
hasID = true
changes = append(changes, rid)