@@ -104,6 +104,10 @@ 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+ // Close is the same as Done, but evicts resources related to this layer immediately.
109+ // This is used for cleaning up resources on unmount.
110+ Close () error
107111}
108112
109113// Info is the current status of a layer.
@@ -247,7 +251,7 @@ func (r *Resolver) Resolve(ctx context.Context, hosts []docker.RegistryHost, ref
247251 return & layerRef {l , done }, nil
248252 }
249253 // Cached layer is invalid
250- done ()
254+ done (true )
251255 r .layerCacheMu .Lock ()
252256 r .layerCache .Remove (name )
253257 r .layerCacheMu .Unlock ()
@@ -262,7 +266,7 @@ func (r *Resolver) Resolve(ctx context.Context, hosts []docker.RegistryHost, ref
262266 }
263267 defer func () {
264268 if retErr != nil {
265- blobR .done ()
269+ blobR .done (true )
266270 }
267271 }()
268272
@@ -364,7 +368,7 @@ func (r *Resolver) resolveBlob(ctx context.Context, hosts []docker.RegistryHost,
364368 return & blobRef {blob , done }, nil
365369 }
366370 // invalid blob. discard this.
367- done ()
371+ done (true )
368372 r .blobCacheMu .Lock ()
369373 r .blobCache .Remove (name )
370374 r .blobCacheMu .Unlock ()
@@ -454,7 +458,12 @@ func (l *layer) Refresh(ctx context.Context, hosts []docker.RegistryHost, refspe
454458}
455459
456460func (l * layerRef ) Done () {
457- l .done ()
461+ l .done (false )
462+ }
463+
464+ func (l * layerRef ) Close () error {
465+ l .done (true )
466+ return nil
458467}
459468
460469func (l * layer ) RootNode (baseInode uint32 , idMapper idtools.IDMap ) (fusefs.InodeEmbedder , error ) {
@@ -482,7 +491,7 @@ func (l *layer) close() error {
482491 if l .bgResolver != nil {
483492 l .bgResolver .Close ()
484493 }
485- defer l .blob .done () // Close reader first, then close the blob
494+ defer l .blob .done (true ) // Close reader first, then close the blob
486495 return l .r .Close ()
487496}
488497
@@ -511,15 +520,15 @@ func getDisableXAttrAnnotation(desc ocispec.Descriptor) bool {
511520// to this blob will be discarded.
512521type blobRef struct {
513522 remote.Blob
514- done func ()
523+ done func (bool )
515524}
516525
517526// layerRef is a reference to the layer in the cache. Calling `Done` or `done` decreases the
518527// reference counter of this blob in the underlying cache. When nobody refers to the layer in the
519528// cache, resources bound to this layer will be discarded.
520529type layerRef struct {
521530 * layer
522- done func ()
531+ done func (bool )
523532}
524533
525534type readerAtFunc func ([]byte , int64 ) (int , error )
0 commit comments