diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2021-07-13 11:41:02 +0200 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2021-07-15 17:14:26 +0200 |
commit | 022c4795510306e08a4aba31504ca382d41c7fac (patch) | |
tree | d4c29f62038d0f336d90f32f46bc5b4f5c3ddc28 /hugofs/decorators.go | |
parent | f27e542442d19436f1428cc22bb03aca398d37a7 (diff) |
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
Diffstat (limited to 'hugofs/decorators.go')
-rw-r--r-- | hugofs/decorators.go | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/hugofs/decorators.go b/hugofs/decorators.go index 62d234944..364a3e23e 100644 --- a/hugofs/decorators.go +++ b/hugofs/decorators.go @@ -23,7 +23,7 @@ import ( "github.com/spf13/afero" ) -func decorateDirs(fs afero.Fs, meta FileMeta) afero.Fs { +func decorateDirs(fs afero.Fs, meta *FileMeta) afero.Fs { ffs := &baseFileDecoratorFs{Fs: fs} decorator := func(fi os.FileInfo, name string) (os.FileInfo, error) { @@ -82,9 +82,11 @@ func NewBaseFileDecorator(fs afero.Fs, callbacks ...func(fi FileMetaInfo)) afero decorator := func(fi os.FileInfo, filename string) (os.FileInfo, error) { // Store away the original in case it's a symlink. - meta := FileMeta{metaKeyName: fi.Name()} + meta := NewFileMeta() + meta.Name = fi.Name() + if fi.IsDir() { - meta[metaKeyJoinStat] = func(name string) (FileMetaInfo, error) { + meta.JoinStatFunc = func(name string) (FileMetaInfo, error) { joinedFilename := filepath.Join(filename, name) fi, _, err := lstatIfPossible(fs, joinedFilename) if err != nil { @@ -102,7 +104,7 @@ func NewBaseFileDecorator(fs afero.Fs, callbacks ...func(fi FileMetaInfo)) afero isSymlink := isSymlink(fi) if isSymlink { - meta[metaKeyOriginalFilename] = filename + meta.OriginalFilename = filename var link string var err error link, fi, err = evalSymlinks(fs, filename) @@ -110,7 +112,7 @@ func NewBaseFileDecorator(fs afero.Fs, callbacks ...func(fi FileMetaInfo)) afero return nil, err } filename = link - meta[metaKeyIsSymlink] = true + meta.IsSymlink = true } opener := func() (afero.File, error) { |