Skip to content

Commit 6e9211c

Browse files
fix: Resource Cleanup of cache
Signed-off-by: Shubhranshu Mahapatra <[email protected]>
1 parent 8168803 commit 6e9211c

File tree

4 files changed

+27
-4
lines changed

4 files changed

+27
-4
lines changed

fs/fs.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1228,8 +1228,13 @@ func (fs *filesystem) Unmount(ctx context.Context, mountpoint string) error {
12281228
delete(fs.layer, mountpoint)
12291229
// If the mountpoint is an id-mapped layer, it is pointing to the
12301230
// underlying layer, so we cannot call done on it.
1231+
// We do a evict call to call the registered evict functions.
1232+
// This cleans up layer resources and removes it from the resolver cache,
1233+
// preparing the layer for removal and freeing associated memory done on
1234+
// call of the finalizer in span manager
12311235
if !isIDMappedDir(mountpoint) {
12321236
l.Done()
1237+
fs.resolver.Evict(l.GetCacheRefKey())
12331238
}
12341239
fs.layerMu.Unlock()
12351240
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/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
}

0 commit comments

Comments
 (0)