@@ -31,6 +31,7 @@ import (
31
31
"github.com/opencontainers/image-spec/identity"
32
32
ocispecs "github.com/opencontainers/image-spec/specs-go/v1"
33
33
"github.com/pkg/errors"
34
+ "golang.org/x/sync/errgroup"
34
35
)
35
36
36
37
const (
@@ -277,31 +278,32 @@ func (e *imageExporterInstance) Export(ctx context.Context, src *exporter.Source
277
278
}
278
279
279
280
if ! e .storeAllowIncomplete {
281
+ var refs []cache.ImmutableRef
280
282
if src .Ref != nil {
281
- remotes , err := src .Ref .GetRemotes (ctx , false , e .opts .RefCfg , false , session .NewGroup (sessionID ))
282
- if err != nil {
283
- return nil , nil , err
284
- }
285
- remote := remotes [0 ]
286
- if unlazier , ok := remote .Provider .(cache.Unlazier ); ok {
287
- if err := unlazier .Unlazy (ctx ); err != nil {
288
- return nil , nil , err
289
- }
290
- }
283
+ refs = append (refs , src .Ref )
291
284
}
292
- if len (src .Refs ) > 0 {
293
- for _ , r := range src .Refs {
294
- remotes , err := r .GetRemotes (ctx , false , e .opts .RefCfg , false , session .NewGroup (sessionID ))
285
+ for _ , ref := range src .Refs {
286
+ refs = append (refs , ref )
287
+ }
288
+ eg , ctx := errgroup .WithContext (ctx )
289
+ for _ , ref := range refs {
290
+ ref := ref
291
+ eg .Go (func () error {
292
+ remotes , err := ref .GetRemotes (ctx , false , e .opts .RefCfg , false , session .NewGroup (sessionID ))
295
293
if err != nil {
296
- return nil , nil , err
294
+ return err
297
295
}
298
296
remote := remotes [0 ]
299
297
if unlazier , ok := remote .Provider .(cache.Unlazier ); ok {
300
298
if err := unlazier .Unlazy (ctx ); err != nil {
301
- return nil , nil , err
299
+ return err
302
300
}
303
301
}
304
- }
302
+ return nil
303
+ })
304
+ }
305
+ if err := eg .Wait (); err != nil {
306
+ return nil , nil , err
305
307
}
306
308
}
307
309
}
@@ -331,10 +333,18 @@ func (e *imageExporterInstance) Export(ctx context.Context, src *exporter.Source
331
333
}
332
334
333
335
func (e * imageExporterInstance ) pushImage (ctx context.Context , src * exporter.Source , sessionID string , targetName string , dgst digest.Digest ) error {
336
+ var refs []cache.ImmutableRef
337
+ if src .Ref != nil {
338
+ refs = append (refs , src .Ref )
339
+ }
340
+ for _ , ref := range src .Refs {
341
+ refs = append (refs , ref )
342
+ }
343
+
334
344
annotations := map [digest.Digest ]map [string ]string {}
335
345
mprovider := contentutil .NewMultiProvider (e .opt .ImageWriter .ContentStore ())
336
- if src . Ref != nil {
337
- remotes , err := src . Ref .GetRemotes (ctx , false , e .opts .RefCfg , false , session .NewGroup (sessionID ))
346
+ for _ , ref := range refs {
347
+ remotes , err := ref .GetRemotes (ctx , false , e .opts .RefCfg , false , session .NewGroup (sessionID ))
338
348
if err != nil {
339
349
return err
340
350
}
@@ -344,19 +354,6 @@ func (e *imageExporterInstance) pushImage(ctx context.Context, src *exporter.Sou
344
354
addAnnotations (annotations , desc )
345
355
}
346
356
}
347
- if len (src .Refs ) > 0 {
348
- for _ , r := range src .Refs {
349
- remotes , err := r .GetRemotes (ctx , false , e .opts .RefCfg , false , session .NewGroup (sessionID ))
350
- if err != nil {
351
- return err
352
- }
353
- remote := remotes [0 ]
354
- for _ , desc := range remote .Descriptors {
355
- mprovider .Add (desc .Digest , remote .Provider )
356
- addAnnotations (annotations , desc )
357
- }
358
- }
359
- }
360
357
return push .Push (ctx , e .opt .SessionManager , sessionID , mprovider , e .opt .ImageWriter .ContentStore (), dgst , targetName , e .insecure , e .opt .RegistryHosts , e .pushByDigest , annotations )
361
358
}
362
359
0 commit comments