fix(analyze): write StoredDir stats under the dir mutex
This commit is contained in:
1 parent
83e8e1e984
commit
81677f94ee
1 file changed
+22
-4
+22
-4
@@ -352,27 +352,45 @@ func (f *StoredDir) updateStats(linkedItems fs.HardLinkedItems, filteringFiles b
|
|||||||
var itemCount int64
|
var itemCount int64
|
||||||
f.cachedFiles = nil
|
f.cachedFiles = nil
|
||||||
files := f.loadFiles()
|
files := f.loadFiles()
|
||||||
|
|
||||||
|
// Snapshot the mutable stat fields under the read lock and commit them back
|
||||||
|
// under the write lock, mirroring Dir.updateStats. Readers of these fields
|
||||||
|
// (GetSize, GetUsage, GetFlag, GetMtime, GetItemCount) all take f.m, so the
|
||||||
|
// writes here must take it too, e.g. when the stats are recomputed while a
|
||||||
|
// preview reads the same directory mid-scan.
|
||||||
|
f.m.RLock()
|
||||||
|
mtime := f.Mtime
|
||||||
|
flag := f.Flag
|
||||||
|
f.m.RUnlock()
|
||||||
|
|
||||||
for _, entry := range files {
|
for _, entry := range files {
|
||||||
count, size, usage := entry.GetItemStats(linkedItems, filteringFiles)
|
count, size, usage := entry.GetItemStats(linkedItems, filteringFiles)
|
||||||
totalSize += size
|
totalSize += size
|
||||||
totalUsage += usage
|
totalUsage += usage
|
||||||
itemCount += count
|
itemCount += count
|
||||||
|
|
||||||
if entry.GetMtime().After(f.Mtime) {
|
entryMtime := entry.GetMtime()
|
||||||
f.Mtime = entry.GetMtime()
|
if entryMtime.After(mtime) {
|
||||||
|
mtime = entryMtime
|
||||||
}
|
}
|
||||||
|
|
||||||
switch entry.GetFlag() {
|
switch entry.GetFlag() {
|
||||||
case '!', '.':
|
case '!', '.':
|
||||||
if f.Flag != '!' {
|
if flag != '!' {
|
||||||
f.Flag = '.'
|
flag = '.'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
f.cachedFiles = nil
|
f.cachedFiles = nil
|
||||||
|
|
||||||
|
f.m.Lock()
|
||||||
|
f.Mtime = mtime
|
||||||
|
f.Flag = flag
|
||||||
f.ItemCount = itemCount + 1
|
f.ItemCount = itemCount + 1
|
||||||
f.Size = totalSize
|
f.Size = totalSize
|
||||||
f.Usage = totalUsage
|
f.Usage = totalUsage
|
||||||
|
f.m.Unlock()
|
||||||
|
|
||||||
err := DefaultStorage.StoreDir(f)
|
err := DefaultStorage.StoreDir(f)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err.Error())
|
log.Print(err.Error())
|
||||||
|
|||||||
Reference in new issue
Block a user