Skip to content

Commit 1bd8d4a

Browse files
fix: Resource Cleanup of cache
Signed-off-by: Shubhranshu Mahapatra <[email protected]>
1 parent 143ed2b commit 1bd8d4a

File tree

6 files changed

+24
-5
lines changed

6 files changed

+24
-5
lines changed

fs/fs.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1230,6 +1230,7 @@ func (fs *filesystem) Unmount(ctx context.Context, mountpoint string) error {
12301230
// underlying layer, so we cannot call done on it.
12311231
if !isIDMappedDir(mountpoint) {
12321232
l.Done()
1233+
fs.resolver.Evict(l.GetCacheRefKey())
12331234
}
12341235
fs.layerMu.Unlock()
12351236
fs.metricsController.Remove(mountpoint)

fs/fs_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ func (l *breakableLayer) SkipVerify() {}
9393
func (l *breakableLayer) ReadAt([]byte, int64, ...remote.Option) (int, error) {
9494
return 0, fmt.Errorf("fail")
9595
}
96+
func (l *breakableLayer) GetCacheRefKey() string { return "" }
9697
func (l *breakableLayer) BackgroundFetch() error { return fmt.Errorf("fail") }
9798
func (l *breakableLayer) Check() error {
9899
if !l.success {

fs/layer/layer.go

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,9 @@ type Layer interface {
104104
// Done releases the reference to this layer. The resources related to this layer will be
105105
// discarded sooner or later. Queries after calling this function won't be serviced.
106106
Done()
107+
108+
// GetCacheRefKey returns the reference key for the cache used by the layer
109+
GetCacheRefKey() string
107110
}
108111

109112
// Info is the current status of a layer.
@@ -226,6 +229,12 @@ func newCache(root string, cacheType string, cfg config.FSConfig) (cache.BlobCac
226229
)
227230
}
228231

232+
func (r *Resolver) Evict(name string) {
233+
r.layerCacheMu.Lock()
234+
r.layerCache.Remove(name)
235+
r.layerCacheMu.Unlock()
236+
}
237+
229238
// Resolve resolves a layer based on the passed layer blob information.
230239
func (r *Resolver) Resolve(ctx context.Context, hosts []docker.RegistryHost, refspec reference.Spec, desc, sociDesc ocispec.Descriptor, opCounter *FuseOperationCounter, disableVerification bool, metadataOpts ...metadata.Option) (_ Layer, retErr error) {
231240
name := refspec.String() + "/" + desc.Digest.String()
@@ -339,7 +348,7 @@ func (r *Resolver) Resolve(ctx context.Context, hosts []docker.RegistryHost, ref
339348
}
340349
disableXAttrs := getDisableXAttrAnnotation(sociDesc)
341350
// Combine layer information together and cache it.
342-
l := newLayer(r, desc, blobR, vr, bgLayerResolver, opCounter, disableXAttrs)
351+
l := newLayer(r, desc, name, blobR, vr, bgLayerResolver, opCounter, disableXAttrs)
343352
r.layerCacheMu.Lock()
344353
cachedL, done2, added := r.layerCache.Add(name, l)
345354
r.layerCacheMu.Unlock()
@@ -387,6 +396,7 @@ func (r *Resolver) resolveBlob(ctx context.Context, hosts []docker.RegistryHost,
387396
func newLayer(
388397
resolver *Resolver,
389398
desc ocispec.Descriptor,
399+
cacheRefKey string,
390400
blob *blobRef,
391401
r reader.Reader,
392402
bgResolver backgroundfetcher.Resolver,
@@ -396,6 +406,7 @@ func newLayer(
396406
return &layer{
397407
resolver: resolver,
398408
desc: desc,
409+
cacheRefKey: cacheRefKey,
399410
blob: blob,
400411
r: r,
401412
bgResolver: bgResolver,
@@ -405,9 +416,10 @@ func newLayer(
405416
}
406417

407418
type layer struct {
408-
resolver *Resolver
409-
desc ocispec.Descriptor
410-
blob *blobRef
419+
resolver *Resolver
420+
desc ocispec.Descriptor
421+
cacheRefKey string
422+
blob *blobRef
411423

412424
bgResolver backgroundfetcher.Resolver
413425

@@ -420,6 +432,10 @@ type layer struct {
420432
closedMu sync.Mutex
421433
}
422434

435+
func (l *layer) GetCacheRefKey() string {
436+
return l.cacheRefKey
437+
}
438+
423439
func (l *layer) Info() Info {
424440
return Info{
425441
Digest: l.desc.Digest,

fs/reader/reader.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ type reader struct {
8484

8585
closed bool
8686
closedMu sync.Mutex
87+
spanMu sync.Mutex
8788

8889
disableVerification bool
8990
}

fs/span-manager/span_manager.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,7 @@ func (m *SpanManager) verifySpanContents(compressedData []byte, spanID compressi
430430

431431
// Close closes both the underlying zinfo data and blob cache.
432432
func (m *SpanManager) Close() {
433+
log.L.Debug("Spancache finalizer called. Cleaning up spancache")
433434
m.zinfo.Close()
434435
m.cache.Close()
435436
}

snapshot/snapshot.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -707,7 +707,6 @@ func (o *snapshotter) getCleanupDirectories(ctx context.Context, t storage.Trans
707707
if err != nil {
708708
return nil, err
709709
}
710-
711710
cleanup := []string{}
712711
for _, d := range dirs {
713712
if !cleanupCommitted {

0 commit comments

Comments
 (0)