@@ -40,7 +40,6 @@ import (
4040 "github.com/containerd/stargz-snapshotter/estargz/errorutil"
4141 "github.com/klauspost/compress/zstd"
4242 digest "github.com/opencontainers/go-digest"
43- "golang.org/x/sync/errgroup"
4443)
4544
4645type GzipHelperFunc func (io.Reader ) (io.ReadCloser , error )
@@ -235,14 +234,15 @@ func Build(tarBlob *io.SectionReader, opt ...Option) (_ *Blob, rErr error) {
235234 }
236235 writers := make ([]* Writer , len (tarParts ))
237236 payloads := make ([]* os.File , len (tarParts ))
238- var mu sync.Mutex
239- var eg errgroup. Group
237+ var wg sync.WaitGroup
238+ errCh := make ( chan error , len ( tarParts )) // buffered to avoid goroutine leaks
240239 for i , parts := range tarParts {
241240 // builds verifiable stargz sub-blobs
242- eg .Go (func () error {
241+ wg .Go (func () {
243242 esgzFile , err := layerFiles .TempFile ("" , "esgzdata" )
244243 if err != nil {
245- return err
244+ errCh <- err
245+ return
246246 }
247247 sw := NewWriterWithCompressor (esgzFile , opts .compression )
248248 sw .ChunkSize = opts .chunkSize
@@ -254,18 +254,20 @@ func Build(tarBlob *io.SectionReader, opt ...Option) (_ *Blob, rErr error) {
254254 sw .needsOpenGzEntries [f ] = struct {}{}
255255 }
256256 if err := sw .AppendTar (readerFromEntries (parts ... )); err != nil {
257- return err
257+ errCh <- err
258+ return
258259 }
259- mu .Lock ()
260260 writers [i ] = sw
261261 payloads [i ] = esgzFile
262- mu .Unlock ()
263- return nil
264262 })
265263 }
266- if err := eg .Wait (); err != nil {
267- rErr = err
268- return nil , err
264+ wg .Wait ()
265+ close (errCh )
266+
267+ for err := range errCh {
268+ if err != nil {
269+ return nil , err
270+ }
269271 }
270272 tocAndFooter , tocDgst , err := closeWithCombine (writers ... )
271273 if err != nil {
0 commit comments