From c5b0f95dac10cd922a7cb211d3ff67f757610150 Mon Sep 17 00:00:00 2001 From: Andrey Kuchin <dev.kuchin@gmail.com> Date: Sat, 29 Jun 2019 16:41:15 +0300 Subject: [PATCH] fix cuncurrent [read/]write panic --- pkg/fsutils/filecache.go | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/pkg/fsutils/filecache.go b/pkg/fsutils/filecache.go index 6c97bdda..8e4d8c32 100644 --- a/pkg/fsutils/filecache.go +++ b/pkg/fsutils/filecache.go @@ -3,6 +3,7 @@ package fsutils import ( "fmt" "io/ioutil" + "sync" "github.com/golangci/golangci-lint/pkg/logutils" @@ -10,19 +11,17 @@ import ( ) type FileCache struct { - files map[string][]byte + files sync.Map } func NewFileCache() *FileCache { - return &FileCache{ - files: map[string][]byte{}, - } + return &FileCache{} } func (fc *FileCache) GetFileBytes(filePath string) ([]byte, error) { - cachedBytes := fc.files[filePath] - if cachedBytes != nil { - return cachedBytes, nil + cachedBytes, ok := fc.files.Load(filePath) + if ok { + return cachedBytes.([]byte), nil } fileBytes, err := ioutil.ReadFile(filePath) @@ -30,7 +29,7 @@ func (fc *FileCache) GetFileBytes(filePath string) ([]byte, error) { return nil, errors.Wrapf(err, "can't read file %s", filePath) } - fc.files[filePath] = fileBytes + fc.files.Store(filePath, fileBytes) return fileBytes, nil } @@ -56,9 +55,13 @@ func prettifyBytesCount(n int) string { func (fc *FileCache) PrintStats(log logutils.Log) { var size int - for _, fileBytes := range fc.files { - size += len(fileBytes) - } + var mapLen int + fc.files.Range(func(_, fileBytes interface{}) bool { + mapLen++ + size += len(fileBytes.([]byte)) - log.Infof("File cache stats: %d entries of total size %s", len(fc.files), prettifyBytesCount(size)) + return true + }) + + log.Infof("File cache stats: %d entries of total size %s", mapLen, prettifyBytesCount(size)) }