From: Bjørn Erik Pedersen Date: Sat, 18 May 2019 06:38:58 +0000 (+0200) Subject: hugolib: Prevent parallel server rebuilds X-Git-Tag: v0.55.6~4 X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=95ce2a40e734bb82b69f9a64270faf3ed69c92cc;p=brevno-suite%2Fhugo hugolib: Prevent parallel server rebuilds There have been reports about infrequent paginator crashes when running the Hugo server since 0.55.0. The reason have been narrowed down to that of parallel rebuilds. This isn't a new thing, but the changes in 0.55.0 made it extra important to serialize the page initialization. This commit fixes that by protecting the `Build` method with a lock when running in server mode. Fixes #5885 Fixes #5968 --- diff --git a/hugolib/hugo_sites.go b/hugolib/hugo_sites.go index 6f95dbb1..5be4ec02 100644 --- a/hugolib/hugo_sites.go +++ b/hugolib/hugo_sites.go @@ -62,6 +62,9 @@ type HugoSites struct { // If this is running in the dev server. running bool + // Serializes rebuilds when server is running. + runningMu sync.Mutex + // Render output formats for all sites. renderFormats output.Formats diff --git a/hugolib/hugo_sites_build.go b/hugolib/hugo_sites_build.go index d748a016..7f725def 100644 --- a/hugolib/hugo_sites_build.go +++ b/hugolib/hugo_sites_build.go @@ -31,6 +31,12 @@ import ( // Build builds all sites. If filesystem events are provided, // this is considered to be a potential partial rebuild. func (h *HugoSites) Build(config BuildCfg, events ...fsnotify.Event) error { + if h.running { + // Make sure we don't trigger rebuilds in parallel. + h.runningMu.Lock() + defer h.runningMu.Unlock() + } + ctx, task := trace.NewTask(context.Background(), "Build") defer task.End()