ref: 8cea4288028ea49906a9163fb7e862d77fa4f123
parent: 0c01fef3213e1aad1f8901c8822d47c2f47bdf4a
author: Bjørn Erik Pedersen <[email protected]>
date: Fri Dec 18 04:54:46 EST 2015
Fix data race in non-renderable pages Fixes #1601
--- a/hugolib/page.go
+++ b/hugolib/page.go
@@ -66,6 +66,7 @@
contentType string
renderable bool
Layout string
+ layoutsCalculated []string
linkTitle string
frontmatter []byte
rawContent []byte
@@ -288,6 +289,10 @@
}
func (p *Page) layouts(l ...string) []string {
+ if len(p.layoutsCalculated) > 0 {
+ return p.layoutsCalculated
+ }
+
if p.Layout != "" {
return layouts(p.Type(), p.Layout)
}
--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -920,6 +920,26 @@
procs := getGoMaxProcs()
+ // this cannot be fanned out to multiple Go routines
+ // See issue #1601
+ // TODO(bep): Check the IsRenderable logic.
+ for _, p := range s.Pages {
+ var layouts []string
+ if !p.IsRenderable() {
+ self := "__" + p.TargetPath()
+ _, err := s.Tmpl.New(self).Parse(string(p.Content))
+ if err != nil {
+ results <- err
+ continue
+ }
+ layouts = append(layouts, self)
+ } else {
+ layouts = append(layouts, p.layouts()...)
+ layouts = append(layouts, "_default/single.html")
+ }
+ p.layoutsCalculated = layouts
+ }
+
wg := &sync.WaitGroup{}
for i := 0; i < procs*4; i++ {
@@ -951,22 +971,7 @@
func pageRenderer(s *Site, pages <-chan *Page, results chan<- error, wg *sync.WaitGroup) {
defer wg.Done()
for p := range pages {
- var layouts []string
-
- if !p.IsRenderable() {
- self := "__" + p.TargetPath()
- _, err := s.Tmpl.New(self).Parse(string(p.Content))
- if err != nil {
- results <- err
- continue
- }
- layouts = append(layouts, self)
- } else {
- layouts = append(layouts, p.layouts()...)
- layouts = append(layouts, "_default/single.html")
- }
-
- err := s.renderAndWritePage("page "+p.FullFilePath(), p.TargetPath(), p, s.appendThemeTemplates(layouts)...)
+ err := s.renderAndWritePage("page "+p.FullFilePath(), p.TargetPath(), p, s.appendThemeTemplates(p.layouts())...)
if err != nil {
results <- err
}
--- a/hugolib/site_test.go
+++ b/hugolib/site_test.go
@@ -158,7 +158,7 @@
templateName := fmt.Sprintf("foobar%d", i)
err = s.addTemplate(templateName, test.template)
if err != nil {
- t.Fatalf("Unable to add template")
+ t.Fatalf("Unable to add template: %s", err)
}
p.Content = template.HTML(p.Content)
@@ -203,7 +203,7 @@
templateName := fmt.Sprintf("default%d", i)
err = s.addTemplate(templateName, test.template)
if err != nil {
- t.Fatalf("Unable to add template")
+ t.Fatalf("Unable to add template: %s", err)
}
var err2 error