hugolib: Fix deadlock when content building times out

Fixes #5375
This commit is contained in:
Bjørn Erik Pedersen 2018-10-30 11:15:15 +01:00
parent e65268f2c2
commit 729593c842
2 changed files with 39 additions and 2 deletions

View file

@ -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{})
}

View file

@ -290,10 +290,11 @@ func (p *Page) initContent() {
defer cancel() defer cancel()
c := make(chan error, 1) c := make(chan error, 1)
p.contentInitMu.Lock()
defer p.contentInitMu.Unlock()
go func() { go func() {
var err error var err error
p.contentInitMu.Lock()
defer p.contentInitMu.Unlock()
err = p.prepareForRender() err = p.prepareForRender()
if err != nil { if err != nil {
@ -301,6 +302,12 @@ func (p *Page) initContent() {
return return
} }
select {
case <-ctx.Done():
return
default:
}
if len(p.summary) == 0 { if len(p.summary) == 0 {
if err = p.setAutoSummary(); err != nil { if err = p.setAutoSummary(); err != nil {
err = p.errorf(err, "failed to set auto summary") err = p.errorf(err, "failed to set auto summary")