Skip to content

Instantly share code, notes, and snippets.

@ryanmoran
Created September 20, 2021 17:38
Show Gist options
  • Save ryanmoran/44b9e8fe1bbd6b59a86a2626ec1275a7 to your computer and use it in GitHub Desktop.
Save ryanmoran/44b9e8fe1bbd6b59a86a2626ec1275a7 to your computer and use it in GitHub Desktop.
archive.Extract Race
package main
import (
"archive/tar"
"bytes"
"compress/gzip"
"flag"
"fmt"
"io"
"net/http"
"os"
"sync"
"github.com/buildpacks/lifecycle/archive"
"golang.org/x/sys/unix"
)
func main() {
var order string
flag.StringVar(&order, "order", "serial", "run archive.Extract serially or in parallel (serial|parallel)")
flag.Parse()
umask := unix.Umask(0022)
defer unix.Umask(umask)
fmt.Printf("umask before: %o\n", umask)
var tarballs []*archive.NormalizingTarReader
for i := 0; i < 10; i++ {
response, err := http.Get("https://github.com/paketo-buildpacks/go-build/releases/download/v0.4.1/go-build-0.4.1.tgz")
if err != nil {
panic(err)
}
buffer := bytes.NewBuffer(nil)
_, err = io.Copy(buffer, response.Body)
err = response.Body.Close()
if err != nil {
panic(err)
}
gzr, err := gzip.NewReader(buffer)
if err != nil {
panic(err)
}
tmpDir, err := os.MkdirTemp("", "")
if err != nil {
panic(err)
}
tr := archive.NewNormalizingTarReader(tar.NewReader(gzr))
tr.PrependDir(tmpDir)
tarballs = append(tarballs, tr)
}
var err error
if order == "serial" {
err = serial(tarballs)
} else {
err = parallel(tarballs)
}
if err != nil {
panic(err)
}
val := unix.Umask(0)
_ = unix.Umask(val)
fmt.Printf("umask after: %o\n", val)
}
func serial(tarballs []*archive.NormalizingTarReader) error {
for _, tarball := range tarballs {
err := archive.Extract(tarball)
if err != nil {
return err
}
}
return nil
}
func parallel(tarballs []*archive.NormalizingTarReader) error {
wg := &sync.WaitGroup{}
for _, tarball := range tarballs {
wg.Add(1)
go func(tr *archive.NormalizingTarReader, waitGroup *sync.WaitGroup) {
err := archive.Extract(tr)
if err != nil {
panic(err)
}
waitGroup.Done()
}(tarball, wg)
}
wg.Wait()
return nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment