hugolib: Fix deadlock when content building times out
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Tue, 30 Oct 2018 10:15:15 +0000 (11:15 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Tue, 30 Oct 2018 11:18:29 +0000 (12:18 +0100)
Fixes #5375

hugolib/hugo_sites_build_errors_test.go
hugolib/page.go

index a5825b35f43c0dcb054f6405b2a57726d24f0789..3af596d7ca3a539558521b9b96bfe613bdb14c5e 100644 (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{})
+
+}
index f7149ad74410a6528f17f1a6319ea4ebbaa14abd..578aed9edc62c27cdb7c72a4155bdbd7760ff26b 100644 (file)
@@ -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")