mirror of
https://github.com/gohugoio/hugo.git
synced 2025-08-27 22:09:53 +02:00
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:
@@ -144,7 +144,7 @@ func (fs *SliceFs) getOpener(name string) func() (afero.File, error) {
|
||||
func (fs *SliceFs) pickFirst(name string) (os.FileInfo, int, error) {
|
||||
for i, mfs := range fs.dirs {
|
||||
meta := mfs.Meta()
|
||||
fs := meta.Fs()
|
||||
fs := meta.Fs
|
||||
fi, _, err := lstatIfPossible(fs, name)
|
||||
if err == nil {
|
||||
// Gotta match!
|
||||
@@ -162,8 +162,8 @@ func (fs *SliceFs) pickFirst(name string) (os.FileInfo, int, error) {
|
||||
}
|
||||
|
||||
func (fs *SliceFs) readDirs(name string, startIdx, count int) ([]os.FileInfo, error) {
|
||||
collect := func(lfs FileMeta) ([]os.FileInfo, error) {
|
||||
d, err := lfs.Fs().Open(name)
|
||||
collect := func(lfs *FileMeta) ([]os.FileInfo, error) {
|
||||
d, err := lfs.Fs.Open(name)
|
||||
if err != nil {
|
||||
if !os.IsNotExist(err) {
|
||||
return nil, err
|
||||
@@ -204,7 +204,7 @@ func (fs *SliceFs) readDirs(name string, startIdx, count int) ([]os.FileInfo, er
|
||||
duplicates = append(duplicates, i)
|
||||
} else {
|
||||
// Make sure it's opened by this filesystem.
|
||||
dirs[i] = decorateFileInfo(fi, fs, fs.getOpener(fi.(FileMetaInfo).Meta().Filename()), "", "", nil)
|
||||
dirs[i] = decorateFileInfo(fi, fs, fs.getOpener(fi.(FileMetaInfo).Meta().Filename), "", "", nil)
|
||||
seen[fi.Name()] = true
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user