Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/gohugoio/hugo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2022-09-26 18:34:20 +0300
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2022-09-26 20:02:25 +0300
commit29ccb3606967a4e14ebee383decb38fae6c447dc (patch)
tree987dd3c25328fe01dafebd77aebd66f039681a99
parentd8aba18e05895723a6e42ea19be1cfbbed5bf98c (diff)
Fix /static performance regression from Hugo 0.103.0
In `v0.103.0` we added support for `resources.PostProcess` for all file types, not just HTML. We had benchmarks that said we were fine in that department, but those did not consider the static file syncing. This fixes that by: * Making sure that the /static syncer always gets its own file system without any checks for the post process token. * For dynamic files (e.g. rendered HTML files) we add an additional check to make sure that we skip binary files (e.g. images) Fixes #10328
-rw-r--r--commands/hugo.go5
-rw-r--r--deps/deps.go20
-rw-r--r--hugofs/fs.go4
-rw-r--r--hugofs/hasbytes_fs.go8
-rw-r--r--hugolib/filesystems/basefs.go2
-rw-r--r--hugolib/pages_process.go14
6 files changed, 31 insertions, 22 deletions
diff --git a/commands/hugo.go b/commands/hugo.go
index d127d3721..e26f052d4 100644
--- a/commands/hugo.go
+++ b/commands/hugo.go
@@ -653,10 +653,7 @@ func (c *commandeer) copyStaticTo(sourceFs *filesystems.SourceFilesystem) (uint6
syncer.NoChmod = c.Cfg.GetBool("noChmod")
syncer.ChmodFilter = chmodFilter
syncer.SrcFs = fs
- syncer.DestFs = c.Fs.PublishDir
- if c.renderStaticToDisk {
- syncer.DestFs = c.Fs.PublishDirStatic
- }
+ syncer.DestFs = c.Fs.PublishDirStatic
// Now that we are using a unionFs for the static directories
// We can effectively clean the publishDir on initial sync
syncer.Delete = c.Cfg.GetBool("cleanDestinationDir")
diff --git a/deps/deps.go b/deps/deps.go
index e1cbfce06..02730e825 100644
--- a/deps/deps.go
+++ b/deps/deps.go
@@ -2,6 +2,8 @@ package deps
import (
"fmt"
+ "path/filepath"
+ "strings"
"sync"
"sync/atomic"
"time"
@@ -246,16 +248,30 @@ func New(cfg DepsCfg) (*Deps, error) {
execHelper := hexec.New(securityConfig)
var filenameHasPostProcessPrefixMu sync.Mutex
- cb := func(name string, match bool) {
+ hashBytesReceiverFunc := func(name string, match bool) {
if !match {
return
}
filenameHasPostProcessPrefixMu.Lock()
d.FilenameHasPostProcessPrefix = append(d.FilenameHasPostProcessPrefix, name)
filenameHasPostProcessPrefixMu.Unlock()
+ }
+ // Skip binary files.
+ hashBytesSHouldCheck := func(name string) bool {
+ ext := strings.TrimPrefix(filepath.Ext(name), ".")
+ mime, _, found := cfg.MediaTypes.GetBySuffix(ext)
+ if !found {
+ return false
+ }
+ switch mime.MainType {
+ case "text", "application":
+ return true
+ default:
+ return false
+ }
}
- fs.PublishDir = hugofs.NewHasBytesReceiver(fs.PublishDir, cb, []byte(postpub.PostProcessPrefix))
+ fs.PublishDir = hugofs.NewHasBytesReceiver(fs.PublishDir, hashBytesSHouldCheck, hashBytesReceiverFunc, []byte(postpub.PostProcessPrefix))
ps, err := helpers.NewPathSpec(fs, cfg.Language, logger)
if err != nil {
diff --git a/hugofs/fs.go b/hugofs/fs.go
index 63c25a4c0..51bbe0619 100644
--- a/hugofs/fs.go
+++ b/hugofs/fs.go
@@ -40,8 +40,7 @@ type Fs struct {
// It's mounted inside publishDir (default /public).
PublishDir afero.Fs
- // PublishDirStatic is the file system used for static files when --renderStaticToDisk is set.
- // When this is set, PublishDir is set to write to memory.
+ // PublishDirStatic is the file system used for static files.
PublishDirStatic afero.Fs
// PublishDirServer is the file system used for serving the public directory with Hugo's development server.
@@ -142,7 +141,6 @@ func isWrite(flag int) bool {
// MakeReadableAndRemoveAllModulePkgDir makes any subdir in dir readable and then
// removes the root.
// TODO(bep) move this to a more suitable place.
-//
func MakeReadableAndRemoveAllModulePkgDir(fs afero.Fs, dir string) (int, error) {
// Safe guard
if !strings.Contains(dir, "pkg") {
diff --git a/hugofs/hasbytes_fs.go b/hugofs/hasbytes_fs.go
index b5f82877e..3d32a828f 100644
--- a/hugofs/hasbytes_fs.go
+++ b/hugofs/hasbytes_fs.go
@@ -27,12 +27,13 @@ var (
type hasBytesFs struct {
afero.Fs
+ shouldCheck func(name string) bool
hasBytesCallback func(name string, match bool)
pattern []byte
}
-func NewHasBytesReceiver(delegate afero.Fs, hasBytesCallback func(name string, match bool), pattern []byte) afero.Fs {
- return &hasBytesFs{Fs: delegate, hasBytesCallback: hasBytesCallback, pattern: pattern}
+func NewHasBytesReceiver(delegate afero.Fs, shouldCheck func(name string) bool, hasBytesCallback func(name string, match bool), pattern []byte) afero.Fs {
+ return &hasBytesFs{Fs: delegate, shouldCheck: shouldCheck, hasBytesCallback: hasBytesCallback, pattern: pattern}
}
func (fs *hasBytesFs) UnwrapFilesystem() afero.Fs {
@@ -56,6 +57,9 @@ func (fs *hasBytesFs) OpenFile(name string, flag int, perm os.FileMode) (afero.F
}
func (fs *hasBytesFs) wrapFile(f afero.File) afero.File {
+ if !fs.shouldCheck(f.Name()) {
+ return f
+ }
return &hasBytesFile{
File: f,
hbw: &hugio.HasBytesWriter{
diff --git a/hugolib/filesystems/basefs.go b/hugolib/filesystems/basefs.go
index a380857cd..e0fed6f3e 100644
--- a/hugolib/filesystems/basefs.go
+++ b/hugolib/filesystems/basefs.go
@@ -67,7 +67,7 @@ type BaseFs struct {
// This usually maps to /my-project/public.
PublishFs afero.Fs
- // The filesystem used for renderStaticToDisk.
+ // The filesystem used for static files.
PublishFsStatic afero.Fs
// A read-only filesystem starting from the project workDir.
diff --git a/hugolib/pages_process.go b/hugolib/pages_process.go
index 04ac0218a..196a566f0 100644
--- a/hugolib/pages_process.go
+++ b/hugolib/pages_process.go
@@ -32,10 +32,9 @@ func newPagesProcessor(h *HugoSites, sp *source.SourceSpec) *pagesProcessor {
procs := make(map[string]pagesCollectorProcessorProvider)
for _, s := range h.Sites {
procs[s.Lang()] = &sitePagesProcessor{
- m: s.pageMap,
- errorSender: s.h,
- itemChan: make(chan interface{}, config.GetNumWorkerMultiplier()*2),
- renderStaticToDisk: h.Cfg.GetBool("renderStaticToDisk"),
+ m: s.pageMap,
+ errorSender: s.h,
+ itemChan: make(chan interface{}, config.GetNumWorkerMultiplier()*2),
}
}
return &pagesProcessor{
@@ -118,8 +117,6 @@ type sitePagesProcessor struct {
ctx context.Context
itemChan chan any
itemGroup *errgroup.Group
-
- renderStaticToDisk bool
}
func (p *sitePagesProcessor) Process(item any) error {
@@ -164,10 +161,7 @@ func (p *sitePagesProcessor) copyFile(fim hugofs.FileMetaInfo) error {
defer f.Close()
- fs := s.PublishFs
- if p.renderStaticToDisk {
- fs = s.PublishFsStatic
- }
+ fs := s.PublishFsStatic
return s.publish(&s.PathSpec.ProcessingStats.Files, target, f, fs)
}