@@ -93,7 +93,13 @@ func (is *Source) resolveRemote(ctx context.Context, ref string, platform *ocisp
9393 dgst digest.Digest
9494 dt []byte
9595 }
96- res , err := is .g .Do (ctx , ref , func (ctx context.Context ) (interface {}, error ) {
96+ p := platforms .DefaultSpec ()
97+ if platform != nil {
98+ p = * platform
99+ }
100+ // key is used to synchronize resolutions that can happen in parallel when doing multi-stage.
101+ key := "getconfig::" + ref + "::" + platforms .Format (p )
102+ res , err := is .g .Do (ctx , key , func (ctx context.Context ) (interface {}, error ) {
97103 res := resolver .DefaultPool .GetResolver (is .RegistryHosts , ref , "pull" , sm , g )
98104 dgst , dt , err := imageutil .Config (ctx , ref , res , is .ContentStore , nil , platform )
99105 if err != nil {
@@ -247,7 +253,9 @@ func (p *puller) resolveLocal() {
247253}
248254
249255func (p * puller ) resolve (ctx context.Context , g session.Group ) error {
250- _ , err := p .is .g .Do (ctx , "" , func (ctx context.Context ) (_ interface {}, err error ) {
256+ // key is used to synchronize resolutions that can happen in parallel when doing multi-stage.
257+ key := "resolve::" + p .ref + "::" + platforms .Format (p .platform )
258+ _ , err := p .is .g .Do (ctx , key , func (ctx context.Context ) (_ interface {}, err error ) {
251259 resolveProgressDone := oneOffProgress (ctx , "resolve " + p .src .Reference .String ())
252260 defer func () {
253261 resolveProgressDone (err )
0 commit comments