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
44 changed files with 434 additions and 451 deletions

View File

@@ -281,7 +281,7 @@ func (h *HugoSites) GetContentPage(filename string) page.Page {
return false
}
if b.fi.Meta().Filename() == filename {
if b.fi.Meta().Filename == filename {
p = b.p
return true
}
@@ -769,7 +769,7 @@ func (h *HugoSites) removePageByFilename(filename string) {
return false
}
return b.fi.Meta().Filename() == filename
return b.fi.Meta().Filename == filename
})
return nil
})
@@ -919,7 +919,7 @@ func (h *HugoSites) errWithFileContext(err error, f source.File) error {
return err
}
realFilename := fim.Meta().Filename()
realFilename := fim.Meta().Filename
err, _ = herrors.WithFileContextForFile(
err,
@@ -1079,12 +1079,12 @@ func (m *contentChangeMap) resolveAndRemove(filename string) (string, bundleDirT
func (m *contentChangeMap) addSymbolicLinkMapping(fim hugofs.FileMetaInfo) {
meta := fim.Meta()
if !meta.IsSymlink() {
if !meta.IsSymlink {
return
}
m.symContentMu.Lock()
from, to := meta.Filename(), meta.OriginalFilename()
from, to := meta.Filename, meta.OriginalFilename
if fim.IsDir() {
if !strings.HasSuffix(from, helpers.FilePathSeparator) {
from += helpers.FilePathSeparator