Skip to content

Commit 8b2bf80

Browse files
committed
Remove image if rebase or initial fetch fails
If an image is unable to be claimed, the associated image pull with this request will fail, so it would make sense to also remove the rest of the jobs associated with this image. Additionally, if the initial authorization fetch fails, we should also remove the image from unpackJobs to avoid blocking future image pulls. Signed-off-by: David Son <davbson@amazon.com>
1 parent cb2b0e4 commit 8b2bf80

File tree

1 file changed

+30
-21
lines changed

1 file changed

+30
-21
lines changed

fs/fs.go

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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

510518
func (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
559567
func (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

Comments
 (0)