Skip to content

Commit a803a52

Browse files
authored
Merge pull request #1634 from matejvasek/perf-parallelize
perf: parallelize builder's module processing
2 parents 0f0a40b + 1b2dd9f commit a803a52

2 files changed

Lines changed: 67 additions & 19 deletions

File tree

internal/builder/builder.go

Lines changed: 48 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616

1717
"github.com/BurntSushi/toml"
1818
"github.com/buildpacks/imgutil"
19+
v1 "github.com/google/go-containerregistry/pkg/v1"
1920
"github.com/pkg/errors"
2021

2122
"github.com/buildpacks/pack/builder"
@@ -447,29 +448,57 @@ func (b *Builder) Save(logger logging.Logger, creatorMetadata CreatorMetadata) e
447448

448449
func (b *Builder) addModules(kind string, logger logging.Logger, tmpDir string, image imgutil.Image, additionalModules []buildpack.BuildModule, layers dist.ModuleLayers) error {
449450
collectionToAdd := map[string]toAdd{}
451+
452+
type modInfo struct {
453+
info dist.ModuleInfo
454+
layerTar string
455+
diffID v1.Hash
456+
err error
457+
}
458+
459+
lids := make([]chan modInfo, len(additionalModules))
460+
for i := range lids {
461+
lids[i] = make(chan modInfo, 1)
462+
}
463+
450464
for i, module := range additionalModules {
451-
// create directory
452-
modTmpDir := filepath.Join(tmpDir, fmt.Sprintf("%s-%s", kind, strconv.Itoa(i)))
453-
if err := os.MkdirAll(modTmpDir, os.ModePerm); err != nil {
454-
return errors.Wrapf(err, "creating %s temp dir", kind)
455-
}
465+
go func(i int, module buildpack.BuildModule) {
466+
// create directory
467+
modTmpDir := filepath.Join(tmpDir, fmt.Sprintf("%s-%s", kind, strconv.Itoa(i)))
468+
if err := os.MkdirAll(modTmpDir, os.ModePerm); err != nil {
469+
lids[i] <- modInfo{err: errors.Wrapf(err, "creating %s temp dir", kind)}
470+
}
456471

457-
// create tar file
458-
layerTar, err := buildpack.ToLayerTar(modTmpDir, module)
459-
if err != nil {
460-
return err
461-
}
472+
// create tar file
473+
layerTar, err := buildpack.ToLayerTar(modTmpDir, module)
474+
if err != nil {
475+
lids[i] <- modInfo{err: err}
476+
}
462477

463-
// generate diff id
464-
diffID, err := dist.LayerDiffID(layerTar)
465-
info := module.Descriptor().Info()
466-
if err != nil {
467-
return errors.Wrapf(err,
468-
"getting content hashes for %s %s",
469-
kind,
470-
style.Symbol(info.FullName()),
471-
)
478+
// generate diff id
479+
diffID, err := dist.LayerDiffID(layerTar)
480+
info := module.Descriptor().Info()
481+
if err != nil {
482+
lids[i] <- modInfo{err: errors.Wrapf(err,
483+
"getting content hashes for %s %s",
484+
kind,
485+
style.Symbol(info.FullName()),
486+
)}
487+
}
488+
lids[i] <- modInfo{
489+
info: info,
490+
layerTar: layerTar,
491+
diffID: diffID,
492+
}
493+
}(i, module)
494+
}
495+
496+
for i, module := range additionalModules {
497+
mi := <-lids[i]
498+
if mi.err != nil {
499+
return mi.err
472500
}
501+
info, diffID, layerTar := mi.info, mi.diffID, mi.layerTar
473502

474503
// check against builder layers
475504
if existingInfo, ok := layers[info.ID][info.Version]; ok {

pkg/buildpack/package.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package buildpack
22

33
import (
44
"io"
5+
"sync"
56

67
"github.com/pkg/errors"
78

@@ -14,7 +15,25 @@ type Package interface {
1415
GetLayer(diffID string) (io.ReadCloser, error)
1516
}
1617

18+
type syncPkg struct {
19+
mu sync.Mutex
20+
pkg Package
21+
}
22+
23+
func (s *syncPkg) Label(name string) (value string, err error) {
24+
s.mu.Lock()
25+
defer s.mu.Unlock()
26+
return s.pkg.Label(name)
27+
}
28+
29+
func (s *syncPkg) GetLayer(diffID string) (io.ReadCloser, error) {
30+
s.mu.Lock()
31+
defer s.mu.Unlock()
32+
return s.pkg.GetLayer(diffID)
33+
}
34+
1735
func extractBuildpacks(pkg Package) (mainBP BuildModule, depBPs []BuildModule, err error) {
36+
pkg = &syncPkg{pkg: pkg}
1837
md := &Metadata{}
1938
if found, err := dist.GetLabel(pkg, MetadataLabel, md); err != nil {
2039
return nil, nil, err

0 commit comments

Comments
 (0)