From 729593c842794eaf7127050953a5c2256d332051 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Tue, 30 Oct 2018 11:15:15 +0100 Subject: [PATCH] hugolib: Fix deadlock when content building times out Fixes #5375 --- hugolib/hugo_sites_build_errors_test.go | 30 +++++++++++++++++++++++++ hugolib/page.go | 11 +++++++-- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/hugolib/hugo_sites_build_errors_test.go b/hugolib/hugo_sites_build_errors_test.go index a5825b35f43..3af596d7ca3 100644 --- a/hugolib/hugo_sites_build_errors_test.go +++ b/hugolib/hugo_sites_build_errors_test.go @@ -313,3 +313,33 @@ Some content. } } } + +// https://github.com/gohugoio/hugo/issues/5375 +func TestSiteBuildTimeout(t *testing.T) { + + b := newTestSitesBuilder(t) + b.WithConfigFile("toml", ` +timeout = 5 +`) + + b.WithTemplatesAdded("_default/single.html", ` +{{ .WordCount }} +`, "shortcodes/c.html", ` +{{ range .Page.Site.RegularPages }} +{{ .WordCount }} +{{ end }} + +`) + + for i := 1; i < 100; i++ { + b.WithContent(fmt.Sprintf("page%d.md", i), `--- +title: "A page" +--- + +{{< c >}}`) + + } + + b.CreateSites().Build(BuildCfg{}) + +} diff --git a/hugolib/page.go b/hugolib/page.go index f7149ad7441..578aed9edc6 100644 --- a/hugolib/page.go +++ b/hugolib/page.go @@ -290,10 +290,11 @@ func (p *Page) initContent() { defer cancel() c := make(chan error, 1) + p.contentInitMu.Lock() + defer p.contentInitMu.Unlock() + go func() { var err error - p.contentInitMu.Lock() - defer p.contentInitMu.Unlock() err = p.prepareForRender() if err != nil { @@ -301,6 +302,12 @@ func (p *Page) initContent() { return } + select { + case <-ctx.Done(): + return + default: + } + if len(p.summary) == 0 { if err = p.setAutoSummary(); err != nil { err = p.errorf(err, "failed to set auto summary")