@@ -478,33 +478,41 @@ func (fs *filesystem) preloadAllLayers(ctx context.Context, desc ocispec.Descrip
478478 premountCtx = namespaces .WithNamespace (premountCtx , ns )
479479 imageJob := fs .inProgressImageUnpacks .GetOrAddImageJob (imageDigest , cancel )
480480
481- // We only want to premount all layers that don't exist yet.
482- // Since layer order is deterministic, we can safely assume that
483- // every layer after this needs to be premounted as well.
484- startPremounting := false
485- for _ , l := range manifest .Layers {
486- if images .IsLayerType (l .MediaType ) {
487- if l .Digest .String () == desc .Digest .String () {
488- startPremounting = true
489-
490- // We don't have to preauthorize if we only do one request at a time
491- if fs .inProgressImageUnpacks .imagePullCfg .MaxConcurrentDownloadsPerImage != 1 {
492- err = remoteStore .doInitialFetch (ctx , constructRef (refspec , desc ))
493- if err != nil {
494- return fmt .Errorf ("error doing initial client fetch: %w" , err )
481+ // If we fail anywhere after making the image job, we must remove the associated image job
482+ premountAll := func () error {
483+ // We only want to premount all layers that don't exist yet.
484+ // Since layer order is deterministic, we can safely assume that
485+ // every layer after this needs to be premounted as well.
486+ startPremounting := false
487+ for _ , l := range manifest .Layers {
488+ if images .IsLayerType (l .MediaType ) {
489+ if l .Digest .String () == desc .Digest .String () {
490+ startPremounting = true
491+
492+ // We don't have to preauthorize if we only do one request at a time
493+ if fs .inProgressImageUnpacks .imagePullCfg .MaxConcurrentDownloadsPerImage != 1 {
494+ err = remoteStore .doInitialFetch (ctx , constructRef (refspec , desc ))
495+ if err != nil {
496+ return fmt .Errorf ("error doing initial client fetch: %w" , err )
497+ }
495498 }
496499 }
497- }
498- if startPremounting {
499- layerJob , err := fs .inProgressImageUnpacks .AddLayerJob (imageJob , l .Digest .String ())
500- if err != nil {
501- return fmt .Errorf ("error adding layer job: %w" , err )
500+ if startPremounting {
501+ layerJob , err := fs .inProgressImageUnpacks .AddLayerJob (imageJob , l .Digest .String ())
502+ if err != nil {
503+ return fmt .Errorf ("error adding layer job: %w" , err )
504+ }
505+ go fs .premount (premountCtx , l , refspec , remoteStore , diffIDMap , layerJob )
502506 }
503- go fs .premount (premountCtx , l , refspec , remoteStore , diffIDMap , layerJob )
504507 }
505508 }
509+ return nil
506510 }
507- return nil
511+
512+ if err := premountAll (); err != nil {
513+ fs .inProgressImageUnpacks .RemoveImageWithError (imageDigest , err )
514+ }
515+ return err
508516}
509517
510518func (fs * filesystem ) premount (ctx context.Context , desc ocispec.Descriptor , refspec reference.Spec , remoteStore resolverStorage , diffIDMap map [string ]digest.Digest , layerJob * layerUnpackJob ) error {
@@ -559,6 +567,7 @@ func (fs *filesystem) premount(ctx context.Context, desc ocispec.Descriptor, ref
559567func (fs * filesystem ) rebase (ctx context.Context , dgst digest.Digest , imageDigest , mountpoint string ) error {
560568 layerJob , err := fs .inProgressImageUnpacks .Claim (imageDigest , dgst .String ())
561569 if err != nil {
570+ fs .inProgressImageUnpacks .RemoveImageWithError (imageDigest , err )
562571 return fmt .Errorf ("error attempting to claim job to rebase: %w" , err )
563572 }
564573 defer func () {
0 commit comments