Skip to content

Commit 9bc05a1

Browse files
authored
Merge pull request moby#3984 from jedevc/exporter-parallel-unlazy
exporter: unlazy references in parallel
2 parents f9a6b54 + e5223bf commit 9bc05a1

File tree

2 files changed

+48
-54
lines changed

2 files changed

+48
-54
lines changed

exporter/containerimage/export.go

Lines changed: 28 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131
"github.com/opencontainers/image-spec/identity"
3232
ocispecs "github.com/opencontainers/image-spec/specs-go/v1"
3333
"github.com/pkg/errors"
34+
"golang.org/x/sync/errgroup"
3435
)
3536

3637
const (
@@ -277,31 +278,32 @@ func (e *imageExporterInstance) Export(ctx context.Context, src *exporter.Source
277278
}
278279

279280
if !e.storeAllowIncomplete {
281+
var refs []cache.ImmutableRef
280282
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)
291284
}
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))
295293
if err != nil {
296-
return nil, nil, err
294+
return err
297295
}
298296
remote := remotes[0]
299297
if unlazier, ok := remote.Provider.(cache.Unlazier); ok {
300298
if err := unlazier.Unlazy(ctx); err != nil {
301-
return nil, nil, err
299+
return err
302300
}
303301
}
304-
}
302+
return nil
303+
})
304+
}
305+
if err := eg.Wait(); err != nil {
306+
return nil, nil, err
305307
}
306308
}
307309
}
@@ -331,10 +333,18 @@ func (e *imageExporterInstance) Export(ctx context.Context, src *exporter.Source
331333
}
332334

333335
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+
334344
annotations := map[digest.Digest]map[string]string{}
335345
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))
338348
if err != nil {
339349
return err
340350
}
@@ -344,19 +354,6 @@ func (e *imageExporterInstance) pushImage(ctx context.Context, src *exporter.Sou
344354
addAnnotations(annotations, desc)
345355
}
346356
}
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-
}
360357
return push.Push(ctx, e.opt.SessionManager, sessionID, mprovider, e.opt.ImageWriter.ContentStore(), dgst, targetName, e.insecure, e.opt.RegistryHosts, e.pushByDigest, annotations)
361358
}
362359

exporter/oci/export.go

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
"github.com/moby/buildkit/util/progress"
2828
ocispecs "github.com/opencontainers/image-spec/specs-go/v1"
2929
"github.com/pkg/errors"
30+
"golang.org/x/sync/errgroup"
3031
"google.golang.org/grpc/codes"
3132
)
3233

@@ -205,40 +206,36 @@ func (e *imageExporterInstance) Export(ctx context.Context, src *exporter.Source
205206
return nil, nil, err
206207
}
207208

208-
mprovider := contentutil.NewMultiProvider(e.opt.ImageWriter.ContentStore())
209+
var refs []cache.ImmutableRef
209210
if src.Ref != nil {
210-
remotes, err := src.Ref.GetRemotes(ctx, false, e.opts.RefCfg, false, session.NewGroup(sessionID))
211-
if err != nil {
212-
return nil, nil, err
213-
}
214-
remote := remotes[0]
215-
// unlazy before tar export as the tar writer does not handle
216-
// layer blobs in parallel (whereas unlazy does)
217-
if unlazier, ok := remote.Provider.(cache.Unlazier); ok {
218-
if err := unlazier.Unlazy(ctx); err != nil {
219-
return nil, nil, err
220-
}
221-
}
222-
for _, desc := range remote.Descriptors {
223-
mprovider.Add(desc.Digest, remote.Provider)
224-
}
211+
refs = append(refs, src.Ref)
212+
}
213+
for _, ref := range src.Refs {
214+
refs = append(refs, ref)
225215
}
226-
if len(src.Refs) > 0 {
227-
for _, r := range src.Refs {
228-
remotes, err := r.GetRemotes(ctx, false, e.opts.RefCfg, false, session.NewGroup(sessionID))
216+
eg, egCtx := errgroup.WithContext(ctx)
217+
mprovider := contentutil.NewMultiProvider(e.opt.ImageWriter.ContentStore())
218+
for _, ref := range refs {
219+
ref := ref
220+
eg.Go(func() error {
221+
remotes, err := ref.GetRemotes(egCtx, false, e.opts.RefCfg, false, session.NewGroup(sessionID))
229222
if err != nil {
230-
return nil, nil, err
223+
return err
231224
}
232225
remote := remotes[0]
233226
if unlazier, ok := remote.Provider.(cache.Unlazier); ok {
234-
if err := unlazier.Unlazy(ctx); err != nil {
235-
return nil, nil, err
227+
if err := unlazier.Unlazy(egCtx); err != nil {
228+
return err
236229
}
237230
}
238231
for _, desc := range remote.Descriptors {
239232
mprovider.Add(desc.Digest, remote.Provider)
240233
}
241-
}
234+
return nil
235+
})
236+
}
237+
if err := eg.Wait(); err != nil {
238+
return nil, nil, err
242239
}
243240

244241
if e.tar {

0 commit comments

Comments
 (0)