hugofs: Make FileMeta a struct

This commit started out investigating a `concurrent map read write` issue, ending by replacing the map with a struct.

This is easier to reason about, and it's more effective:

```
name                                  old time/op    new time/op    delta
SiteNew/Regular_Deep_content_tree-16    71.5ms ± 3%    69.4ms ± 5%    ~     (p=0.200 n=4+4)

name                                  old alloc/op   new alloc/op   delta
SiteNew/Regular_Deep_content_tree-16    29.7MB ± 0%    27.9MB ± 0%  -5.82%  (p=0.029 n=4+4)

name                                  old allocs/op  new allocs/op  delta
SiteNew/Regular_Deep_content_tree-16      313k ± 0%      303k ± 0%  -3.35%  (p=0.029 n=4+4)
```

See #8749
This commit is contained in:
Bjørn Erik Pedersen 2021-07-13 11:41:02 +02:00
parent f27e542442
commit 022c479551
No known key found for this signature in database
GPG key ID: 330E6E2BD4859D8F
44 changed files with 434 additions and 451 deletions

View file

@ -1,4 +1,4 @@
// Copyright 2019 The Hugo Authors. All rights reserved.
// Copyright 2021 The Hugo Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@ -225,9 +225,9 @@ func NewTestFile(filename string) *FileInfo {
}
func (sp *SourceSpec) NewFileInfoFrom(path, filename string) (*FileInfo, error) {
meta := hugofs.FileMeta{
"filename": filename,
"path": path,
meta := &hugofs.FileMeta{
Filename: filename,
Path: path,
}
return sp.NewFileInfo(hugofs.NewFileMetaInfo(nil, meta))
@ -236,16 +236,16 @@ func (sp *SourceSpec) NewFileInfoFrom(path, filename string) (*FileInfo, error)
func (sp *SourceSpec) NewFileInfo(fi hugofs.FileMetaInfo) (*FileInfo, error) {
m := fi.Meta()
filename := m.Filename()
relPath := m.Path()
isLeafBundle := m.Classifier() == files.ContentClassLeaf
filename := m.Filename
relPath := m.Path
isLeafBundle := m.Classifier == files.ContentClassLeaf
if relPath == "" {
return nil, errors.Errorf("no Path provided by %v (%T)", m, m.Fs())
return nil, errors.Errorf("no Path provided by %v (%T)", m, m.Fs)
}
if filename == "" {
return nil, errors.Errorf("no Filename provided by %v (%T)", m, m.Fs())
return nil, errors.Errorf("no Filename provided by %v (%T)", m, m.Fs)
}
relDir := filepath.Dir(relPath)
@ -256,8 +256,8 @@ func (sp *SourceSpec) NewFileInfo(fi hugofs.FileMetaInfo) (*FileInfo, error) {
relDir = relDir + helpers.FilePathSeparator
}
lang := m.Lang()
translationBaseName := m.GetString("translationBaseName")
lang := m.Lang
translationBaseName := m.TranslationBaseName
dir, name := filepath.Split(relPath)
if !strings.HasSuffix(dir, helpers.FilePathSeparator) {

View file

@ -80,7 +80,7 @@ func (f *Filesystem) captureFiles() error {
}
meta := fi.Meta()
filename := meta.Filename()
filename := meta.Filename
b, err := f.shouldRead(filename, fi)
if err != nil {
@ -105,7 +105,7 @@ func (f *Filesystem) captureFiles() error {
}
func (f *Filesystem) shouldRead(filename string, fi hugofs.FileMetaInfo) (bool, error) {
ignore := f.SourceSpec.IgnoreFile(fi.Meta().Filename())
ignore := f.SourceSpec.IgnoreFile(fi.Meta().Filename)
if fi.IsDir() {
if ignore {

View file

@ -60,7 +60,7 @@ func TestUnicodeNorm(t *testing.T) {
}
ss := newTestSourceSpec()
fi := hugofs.NewFileMetaInfo(nil, hugofs.FileMeta{})
fi := hugofs.NewFileMetaInfo(nil, hugofs.NewFileMeta())
for i, path := range paths {
base := fmt.Sprintf("base%d", i)