Skip to content

Commit 96fe77f

Browse files
committed
pkg/aflow: cache disk usage in Cache
Calculating total disk usage of all cache entries can take very long time for large caches (needs to stat all files). This is especially problematic for tools/syz-aflow. Cache disk usage in the meta file.
1 parent 0874156 commit 96fe77f

File tree

1 file changed

+36
-10
lines changed

1 file changed

+36
-10
lines changed

pkg/aflow/cache.go

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package aflow
55

66
import (
7+
"encoding/json"
78
"fmt"
89
"maps"
910
"os"
@@ -88,7 +89,11 @@ func (c *Cache) Create(typ, desc string, populate func(string) error) (string, e
8889
if err != nil {
8990
return "", err
9091
}
91-
if err := osutil.WriteFile(metaFile, []byte(desc)); err != nil {
92+
meta := cacheMeta{
93+
Description: desc,
94+
DiskUsage: size,
95+
}
96+
if err := osutil.WriteJSON(metaFile, meta); err != nil {
9297
os.RemoveAll(dir)
9398
return "", err
9499
}
@@ -135,26 +140,42 @@ func (c *Cache) init() error {
135140
}
136141
for _, dir := range dirs {
137142
metaFile := filepath.Join(dir, cacheMetaFile)
138-
if !osutil.IsExist(metaFile) {
139-
if err := osutil.RemoveAll(dir); err != nil {
143+
data, err := os.ReadFile(metaFile)
144+
if err != nil {
145+
if os.IsNotExist(err) {
146+
// Incomplete cache dir.
147+
if err := osutil.RemoveAll(dir); err != nil {
148+
return err
149+
}
150+
continue
151+
}
152+
return err
153+
}
154+
var meta cacheMeta
155+
if err := json.Unmarshal(data, &meta); err != nil {
156+
// Assume the old format that contained just the description.
157+
// This code can be removed after 2027-06-01,
158+
// and the code above can use osutil.ReadJSON.
159+
size, err := osutil.DiskUsage(dir)
160+
if err != nil {
161+
return err
162+
}
163+
meta.Description = string(data)
164+
meta.DiskUsage = size
165+
if err := osutil.WriteJSON(metaFile, meta); err != nil {
140166
return err
141167
}
142-
continue
143168
}
144169
stat, err := os.Stat(metaFile)
145170
if err != nil {
146171
return err
147172
}
148-
size, err := osutil.DiskUsage(dir)
149-
if err != nil {
150-
return err
151-
}
152173
c.entries[dir] = &cacheEntry{
153174
dir: dir,
154-
size: size,
175+
size: meta.DiskUsage,
155176
lastUsed: stat.ModTime(),
156177
}
157-
c.currentSize += size
178+
c.currentSize += meta.DiskUsage
158179
}
159180
c.mu.Lock()
160181
defer c.mu.Unlock()
@@ -198,4 +219,9 @@ func (c *Cache) logf(msg string, args ...any) {
198219
}
199220
}
200221

222+
type cacheMeta struct {
223+
Description string
224+
DiskUsage uint64
225+
}
226+
201227
const cacheMetaFile = "aflow-meta"

0 commit comments

Comments
 (0)