@@ -412,7 +412,6 @@ func (phase *BuildPhase) onImageStage(ctx context.Context, img *Image, stg stage
412412 return err
413413 }
414414
415- // Stage is cached in the stages storage
416415 if foundSuitableStage {
417416 logboek .Context (ctx ).Default ().LogFHighlight ("Use cache image for %s\n " , stg .LogDetailedName ())
418417 container_runtime .LogImageInfo (ctx , stg .GetImage (), phase .getPrevNonEmptyStageImageSize ())
@@ -467,6 +466,7 @@ func (phase *BuildPhase) onImageStage(ctx context.Context, img *Image, stg stage
467466func (phase * BuildPhase ) findAndFetchStageFromSecondaryStagesStorage (ctx context.Context , img * Image , stg stage.Interface ) (bool , error ) {
468467 foundSuitableStage := false
469468
469+ storageManager := phase .Conveyor .StorageManager
470470 atomicCopySuitableStageFromSecondaryStagesStorage := func (secondaryStageDesc * imagePkg.StageDescription , secondaryStagesStorage storage.StagesStorage ) error {
471471 // Lock the primary stages storage
472472 var stageUnlocked bool
@@ -484,66 +484,42 @@ func (phase *BuildPhase) findAndFetchStageFromSecondaryStagesStorage(ctx context
484484 defer unlockStage ()
485485 }
486486
487- // Query the primary stages storage for suitable stage again.
488- // Suitable stage can be found this time and should be used in this case
489- if stages , err := phase .Conveyor .StorageManager .GetStagesByDigest (ctx , stg .LogDetailedName (), stg .GetDigest ()); err != nil {
490- return err
491- } else {
492- if stageDesc , err := phase .Conveyor .StorageManager .SelectSuitableStage (ctx , phase .Conveyor , stg , stages ); err != nil {
493- return err
494- } else if stageDesc != nil {
495- i := phase .Conveyor .GetOrCreateStageImage (castToStageImage (phase .StagesIterator .GetPrevImage (img , stg )), stageDesc .Info .Name )
496- i .SetStageDescription (stageDesc )
487+ err := logboek .Context (ctx ).Default ().LogProcess ("Copy suitable stage from secondary %s" , secondaryStagesStorage .String ()).DoError (func () error {
488+ // Copy suitable stage from a secondary stages storage to the primary stages storage
489+ // while primary stages storage lock for this digest is held
490+ if copiedStageDesc , err := storageManager .CopySuitableByDigestStage (ctx , secondaryStageDesc , secondaryStagesStorage , storageManager .GetStagesStorage (), phase .Conveyor .ContainerRuntime ); err != nil {
491+ return fmt .Errorf ("unable to copy suitable stage %s from %s to %s: %s" , secondaryStageDesc .StageID .String (), secondaryStagesStorage .String (), storageManager .GetStagesStorage ().String (), err )
492+ } else {
493+ i := phase .Conveyor .GetOrCreateStageImage (castToStageImage (phase .StagesIterator .GetPrevImage (img , stg )), copiedStageDesc .Info .Name )
494+ i .SetStageDescription (copiedStageDesc )
497495 stg .SetImage (i )
498496
499497 logboek .Context (ctx ).Default ().LogFHighlight ("Use cache image for %s\n " , stg .LogDetailedName ())
500498 container_runtime .LogImageInfo (ctx , stg .GetImage (), phase .getPrevNonEmptyStageImageSize ())
501499
502500 return nil
503501 }
502+ })
503+ if err != nil {
504+ return err
505+ }
504506
505- err = logboek .Context (ctx ).Default ().LogProcess ("Copy suitable stage from secondary %s" , secondaryStagesStorage .String ()).DoError (func () error {
506- // Copy suitable stage from a secondary stages storage to the primary stages storage
507- // while primary stages storage lock for this digest is held
508- if copiedStageDesc , err := phase .Conveyor .StorageManager .CopySuitableByDigestStage (ctx , secondaryStageDesc , secondaryStagesStorage , phase .Conveyor .StorageManager .GetStagesStorage (), phase .Conveyor .ContainerRuntime ); err != nil {
509- return fmt .Errorf ("unable to copy suitable stage %s from %s to %s: %s" , secondaryStageDesc .StageID .String (), secondaryStagesStorage .String (), phase .Conveyor .StorageManager .GetStagesStorage ().String (), err )
510- } else {
511- i := phase .Conveyor .GetOrCreateStageImage (castToStageImage (phase .StagesIterator .GetPrevImage (img , stg )), copiedStageDesc .Info .Name )
512- i .SetStageDescription (copiedStageDesc )
513- stg .SetImage (i )
514-
515- var stageIDs []imagePkg.StageID
516- for _ , stageDesc := range stages {
517- stageIDs = append (stageIDs , * stageDesc .StageID )
518- }
519- stageIDs = append (stageIDs , * copiedStageDesc .StageID )
520-
521- logboek .Context (ctx ).Default ().LogFHighlight ("Use cache image for %s\n " , stg .LogDetailedName ())
522- container_runtime .LogImageInfo (ctx , stg .GetImage (), phase .getPrevNonEmptyStageImageSize ())
523-
524- return nil
525- }
526- })
527- if err != nil {
528- return err
529- }
530-
531- unlockStage ()
532-
533- if err := phase .Conveyor .StorageManager .CopyStageIntoCacheStorages (ctx , stg , phase .Conveyor .ContainerRuntime ); err != nil {
534- return fmt .Errorf ("unable to copy stage %s into cache storages: %s" , stg .GetImage ().GetStageDescription ().StageID .String (), err )
535- }
507+ unlockStage ()
536508
537- return nil
509+ if err := storageManager .CopyStageIntoCacheStorages (ctx , stg , phase .Conveyor .ContainerRuntime ); err != nil {
510+ return fmt .Errorf ("unable to copy stage %s into cache storages: %s" , stg .GetImage ().GetStageDescription ().StageID .String (), err )
538511 }
512+
513+ return nil
539514 }
540515
541516ScanSecondaryStagesStorageList:
542- for _ , secondaryStagesStorage := range phase .Conveyor .StorageManager .GetSecondaryStagesStorageList () {
543- if secondaryStages , err := phase .Conveyor .StorageManager .GetStagesByDigestFromStagesStorage (ctx , stg .LogDetailedName (), stg .GetDigest (), secondaryStagesStorage ); err != nil {
517+ for _ , secondaryStagesStorage := range storageManager .GetSecondaryStagesStorageList () {
518+ secondaryStages , err := storageManager .GetStagesByDigestFromStagesStorageWithCache (ctx , stg .LogDetailedName (), stg .GetDigest (), secondaryStagesStorage )
519+ if err != nil {
544520 return false , err
545521 } else {
546- if secondaryStageDesc , err := phase . Conveyor . StorageManager .SelectSuitableStage (ctx , phase .Conveyor , stg , secondaryStages ); err != nil {
522+ if secondaryStageDesc , err := storageManager .SelectSuitableStage (ctx , phase .Conveyor , stg , secondaryStages ); err != nil {
547523 return false , err
548524 } else if secondaryStageDesc != nil {
549525 if err := atomicCopySuitableStageFromSecondaryStagesStorage (secondaryStageDesc , secondaryStagesStorage ); err != nil {
@@ -601,10 +577,11 @@ func (phase *BuildPhase) calculateStage(ctx context.Context, img *Image, stg sta
601577 Do (phase .Conveyor .GetStageDigestMutex (stg .GetDigest ()).Lock )
602578
603579 foundSuitableStage := false
604- if stages , err := phase .Conveyor .StorageManager .GetStagesByDigest (ctx , stg .LogDetailedName (), stageDigest ); err != nil {
580+ storageManager := phase .Conveyor .StorageManager
581+ if stages , err := storageManager .GetStagesByDigestWithCache (ctx , stg .LogDetailedName (), stageDigest ); err != nil {
605582 return false , phase .Conveyor .GetStageDigestMutex (stg .GetDigest ()).Unlock , err
606583 } else {
607- if stageDesc , err := phase . Conveyor . StorageManager .SelectSuitableStage (ctx , phase .Conveyor , stg , stages ); err != nil {
584+ if stageDesc , err := storageManager .SelectSuitableStage (ctx , phase .Conveyor , stg , stages ); err != nil {
608585 return false , phase .Conveyor .GetStageDigestMutex (stg .GetDigest ()).Unlock , err
609586 } else if stageDesc != nil {
610587 i := phase .Conveyor .GetOrCreateStageImage (castToStageImage (phase .StagesIterator .GetPrevImage (img , stg )), stageDesc .Info .Name )
@@ -811,12 +788,6 @@ func (phase *BuildPhase) atomicBuildStageImage(ctx context.Context, img *Image,
811788 return err
812789 }
813790
814- var stageIDs []imagePkg.StageID
815- for _ , stageDesc := range stages {
816- stageIDs = append (stageIDs , * stageDesc .StageID )
817- }
818- stageIDs = append (stageIDs , * stageImage .GetStageDescription ().StageID )
819-
820791 unlockStage ()
821792
822793 if err := phase .Conveyor .StorageManager .CopyStageIntoCacheStorages (ctx , stg , phase .Conveyor .ContainerRuntime ); err != nil {
0 commit comments