Skip to content

Commit 0345b9a

Browse files
tonistiigisipsma
authored andcommitted
solver: release unreferenced cache keys after gc
Previously this routine only ran after user ran prune command or on reboot of the daemon. Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
1 parent 09d1f0b commit 0345b9a

File tree

5 files changed

+42
-8
lines changed

5 files changed

+42
-8
lines changed

control/control.go

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -72,14 +72,15 @@ type Opt struct {
7272

7373
type Controller struct { // TODO: ControlService
7474
// buildCount needs to be 64bit aligned
75-
buildCount int64
76-
opt Opt
77-
solver *llbsolver.Solver
78-
history *llbsolver.HistoryQueue
79-
cache solver.CacheManager
80-
gatewayForwarder *controlgateway.GatewayForwarder
81-
throttledGC func()
82-
gcmu sync.Mutex
75+
buildCount int64
76+
opt Opt
77+
solver *llbsolver.Solver
78+
history *llbsolver.HistoryQueue
79+
cache solver.CacheManager
80+
gatewayForwarder *controlgateway.GatewayForwarder
81+
throttledGC func()
82+
throttledReleaseUnreferenced func()
83+
gcmu sync.Mutex
8384
*tracev1.UnimplementedTraceServiceServer
8485
}
8586

@@ -118,6 +119,8 @@ func NewController(opt Opt) (*Controller, error) {
118119
gatewayForwarder: gatewayForwarder,
119120
}
120121
c.throttledGC = throttle.After(time.Minute, c.gc)
122+
// use longer interval for releaseUnreferencedCache deleting links quickly is less important
123+
c.throttledReleaseUnreferenced = throttle.After(5*time.Minute, func() { c.releaseUnreferencedCache(context.TODO()) })
121124

122125
defer func() {
123126
time.AfterFunc(time.Second, c.throttledGC)
@@ -183,6 +186,10 @@ func (c *Controller) DiskUsage(ctx context.Context, r *controlapi.DiskUsageReque
183186
return resp, nil
184187
}
185188

189+
func (c *Controller) releaseUnreferencedCache(ctx context.Context) error {
190+
return c.cache.ReleaseUnreferenced(ctx)
191+
}
192+
186193
func (c *Controller) Prune(req *controlapi.PruneRequest, stream controlapi.Control_PruneServer) error {
187194
if atomic.LoadInt64(&c.buildCount) == 0 {
188195
imageutil.CancelCacheLeases()
@@ -611,6 +618,7 @@ func (c *Controller) gc() {
611618
<-done
612619
if size > 0 {
613620
bklog.G(ctx).Debugf("gc cleaned up %d bytes", size)
621+
go c.throttledReleaseUnreferenced()
614622
}
615623
}
616624

solver/cachemanager.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,13 @@ type cacheManager struct {
4242
}
4343

4444
func (c *cacheManager) ReleaseUnreferenced(ctx context.Context) error {
45+
visited := map[string]struct{}{}
4546
return c.backend.Walk(func(id string) error {
4647
return c.backend.WalkResults(id, func(cr CacheResult) error {
48+
if _, ok := visited[cr.ID]; ok {
49+
return nil
50+
}
51+
visited[cr.ID] = struct{}{}
4752
if !c.results.Exists(ctx, cr.ID) {
4853
c.backend.Release(cr.ID)
4954
}

solver/combinedcache.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,18 @@ func (cm *combinedCacheManager) ID() string {
3333
return cm.id
3434
}
3535

36+
func (cm *combinedCacheManager) ReleaseUnreferenced(ctx context.Context) error {
37+
eg, ctx := errgroup.WithContext(ctx)
38+
for _, c := range cm.cms {
39+
func(c CacheManager) {
40+
eg.Go(func() error {
41+
return c.ReleaseUnreferenced(ctx)
42+
})
43+
}(c)
44+
}
45+
return eg.Wait()
46+
}
47+
3648
func (cm *combinedCacheManager) Query(inp []CacheKeyWithSelector, inputIndex Index, dgst digest.Digest, outputIndex Index) ([]*CacheKey, error) {
3749
eg, _ := errgroup.WithContext(context.TODO())
3850
keys := make(map[string]*CacheKey, len(cm.cms))

solver/llbsolver/bridge.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,13 @@ func (lcm *lazyCacheManager) Save(key *solver.CacheKey, s solver.Result, created
421421
return lcm.main.Save(key, s, createdAt)
422422
}
423423

424+
func (lcm *lazyCacheManager) ReleaseUnreferenced(ctx context.Context) error {
425+
if err := lcm.wait(); err != nil {
426+
return err
427+
}
428+
return lcm.main.ReleaseUnreferenced(ctx)
429+
}
430+
424431
func (lcm *lazyCacheManager) wait() error {
425432
<-lcm.waitCh
426433
return lcm.err

solver/types.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,4 +267,6 @@ type CacheManager interface {
267267

268268
// Save saves a result based on a cache key
269269
Save(key *CacheKey, s Result, createdAt time.Time) (*ExportableCacheKey, error)
270+
271+
ReleaseUnreferenced(context.Context) error
270272
}

0 commit comments

Comments
 (0)