Skip to content

Commit 6225925

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

File tree

7 files changed

+29
-13
lines changed

7 files changed

+29
-13
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/layer/layer.go

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ 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() string
107109
}
108110

109111
// Info is the current status of a layer.
@@ -226,6 +228,12 @@ func newCache(root string, cacheType string, cfg config.FSConfig) (cache.BlobCac
226228
)
227229
}
228230

231+
func (r *Resolver) Evict(name string) {
232+
r.layerCacheMu.Lock()
233+
r.layerCache.Remove(name)
234+
r.layerCacheMu.Unlock()
235+
}
236+
229237
// Resolve resolves a layer based on the passed layer blob information.
230238
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) {
231239
name := refspec.String() + "/" + desc.Digest.String()
@@ -339,7 +347,7 @@ func (r *Resolver) Resolve(ctx context.Context, hosts []docker.RegistryHost, ref
339347
}
340348
disableXAttrs := getDisableXAttrAnnotation(sociDesc)
341349
// Combine layer information together and cache it.
342-
l := newLayer(r, desc, blobR, vr, bgLayerResolver, opCounter, disableXAttrs)
350+
l := newLayer(r, desc, name, blobR, vr, bgLayerResolver, opCounter, disableXAttrs)
343351
r.layerCacheMu.Lock()
344352
cachedL, done2, added := r.layerCache.Add(name, l)
345353
r.layerCacheMu.Unlock()
@@ -387,6 +395,7 @@ func (r *Resolver) resolveBlob(ctx context.Context, hosts []docker.RegistryHost,
387395
func newLayer(
388396
resolver *Resolver,
389397
desc ocispec.Descriptor,
398+
cacheRefKey string,
390399
blob *blobRef,
391400
r reader.Reader,
392401
bgResolver backgroundfetcher.Resolver,
@@ -396,6 +405,7 @@ func newLayer(
396405
return &layer{
397406
resolver: resolver,
398407
desc: desc,
408+
cacheRefKey: cacheRefKey,
399409
blob: blob,
400410
r: r,
401411
bgResolver: bgResolver,
@@ -405,9 +415,10 @@ func newLayer(
405415
}
406416

407417
type layer struct {
408-
resolver *Resolver
409-
desc ocispec.Descriptor
410-
blob *blobRef
418+
resolver *Resolver
419+
desc ocispec.Descriptor
420+
cacheRefKey string
421+
blob *blobRef
411422

412423
bgResolver backgroundfetcher.Resolver
413424

@@ -420,6 +431,10 @@ type layer struct {
420431
closedMu sync.Mutex
421432
}
422433

434+
func (l *layer) GetCacheRefKey() string {
435+
return l.cacheRefKey
436+
}
437+
423438
func (l *layer) Info() Info {
424439
return Info{
425440
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: 2 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 {
@@ -752,8 +751,10 @@ func (o *snapshotter) unmountSnapshotDirectory(ctx context.Context, dir string)
752751
if err != nil {
753752
if errors.Is(err, os.ErrNotExist) {
754753
// nothing to unmount as directory does not exist
754+
log.L.Infof("not mounted err ")
755755
return nil
756756
}
757+
log.L.Infof(" mounted err %v", err)
757758
return err
758759
}
759760
if mounted {

util/lrucache/lrucache.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ func (c *Cache) Get(key string) (value interface{}, done func(), ok bool) {
7676
}
7777
rc := o.(*refCounter)
7878
rc.inc()
79-
return rc.v, c.decreaseOnceFunc(rc), true
79+
return rc.v, c.releaseReference(rc), true
8080
}
8181

8282
// Add adds object to the cache and returns the cached contents with incrementing the reference count.
@@ -89,7 +89,7 @@ func (c *Cache) Add(key string, value interface{}) (cachedValue interface{}, don
8989
if o, ok := c.cache.Get(key); ok {
9090
rc := o.(*refCounter)
9191
rc.inc()
92-
return rc.v, c.decreaseOnceFunc(rc), false
92+
return rc.v, c.releaseReference(rc), false
9393
}
9494
rc := &refCounter{
9595
key: key,
@@ -99,7 +99,7 @@ func (c *Cache) Add(key string, value interface{}) (cachedValue interface{}, don
9999
rc.initialize() // Keep this object having at least 1 ref count (will be decreased in OnEviction)
100100
rc.inc() // The client references this object (will be decreased on "done")
101101
c.cache.Add(key, rc)
102-
return rc.v, c.decreaseOnceFunc(rc), true
102+
return rc.v, c.releaseReference(rc), true
103103
}
104104

105105
// Remove removes the specified contents from the cache. OnEvicted callback will be called when
@@ -110,12 +110,11 @@ func (c *Cache) Remove(key string) {
110110
c.cache.Remove(key)
111111
}
112112

113-
func (c *Cache) decreaseOnceFunc(rc *refCounter) func() {
114-
var once sync.Once
113+
func (c *Cache) releaseReference(rc *refCounter) func() {
115114
return func() {
116115
c.mu.Lock()
117116
defer c.mu.Unlock()
118-
once.Do(func() { rc.dec() })
117+
rc.dec()
119118
}
120119
}
121120

util/lrucache/lrucache_test.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,6 @@ func TestEviction(t *testing.T) {
149149
}
150150

151151
done2() // effective
152-
done2() // ignored
153-
done2() // ignored
154152
if len(evicted) != 1 {
155153
t.Errorf("only 1 content must be evicted")
156154
return

0 commit comments

Comments
 (0)