@@ -29,6 +29,7 @@ import (
29
29
"path"
30
30
"path/filepath"
31
31
"strings"
32
+ "sync"
32
33
33
34
"github.com/containerd/accelerated-container-image/pkg/snapshot"
34
35
"github.com/containerd/containerd/archive/compression"
@@ -72,7 +73,7 @@ func prepareWritableLayer(ctx context.Context, dir string) error {
72
73
indexPath := path .Join (dir , "writable_index" )
73
74
os .RemoveAll (dataPath )
74
75
os .RemoveAll (indexPath )
75
- out , err := exec .CommandContext (ctx , binpath , "-s" ,
76
+ out , err := exec .CommandContext (ctx , binpath ,
76
77
dataPath , indexPath , "64" ).CombinedOutput ()
77
78
if err != nil {
78
79
return errors .Wrapf (err , "failed to prepare writable layer: %s" , out )
@@ -257,29 +258,51 @@ func convert() error {
257
258
File : "/opt/overlaybd/baselayers/ext4_64" ,
258
259
})
259
260
260
- lastDigest := ""
261
+ results := make (chan error )
262
+ var waitGroup sync.WaitGroup
263
+ waitGroup .Add (len (manifest .Layers ))
261
264
for idx , layer := range manifest .Layers {
262
- rc , err := fetcher .Fetch (ctx , layer )
263
- if err != nil {
264
- return errors .Wrapf (err , "failed to download for layer %d" , idx )
265
- }
266
- drc , err := compression .DecompressStream (rc )
267
- if err != nil {
268
- return errors .Wrapf (err , "failed to decompress for layer %d" , idx )
269
- }
270
- layerDir := path .Join (dir , layer .Digest .String ())
271
- if err = os .MkdirAll (layerDir , 0644 ); err != nil {
272
- return err
273
- }
265
+ go func (idx int , layer specs.Descriptor ) {
266
+ rc , err := fetcher .Fetch (ctx , layer )
267
+ if err != nil {
268
+ results <- errors .Wrapf (err , "failed to download for layer %d" , idx )
269
+ return
270
+ }
271
+ drc , err := compression .DecompressStream (rc )
272
+ if err != nil {
273
+ results <- errors .Wrapf (err , "failed to decompress for layer %d" , idx )
274
+ return
275
+ }
276
+ layerDir := path .Join (dir , fmt .Sprintf ("%04d_" , idx )+ layer .Digest .String ())
277
+ if err = os .MkdirAll (layerDir , 0644 ); err != nil {
278
+ results <- err
279
+ return
280
+ }
281
+ ftar , err := os .Create (path .Join (layerDir , "layer.tar" ))
282
+ if err != nil {
283
+ results <- err
284
+ return
285
+ }
286
+ if _ , err = io .Copy (ftar , drc ); err != nil {
287
+ results <- errors .Wrapf (err , "failed to decompress copy for layer %d" , idx )
288
+ return
289
+ }
290
+ logrus .Infof ("downloaded layer %d, dir %s" , idx , layerDir )
291
+ waitGroup .Done ()
292
+ }(idx , layer )
293
+ }
274
294
275
- ftar , err := os .Create (path .Join (layerDir , "layer.tar" ))
276
- if err != nil {
277
- return err
278
- }
279
- if _ , err = io .Copy (ftar , drc ); err != nil {
280
- return errors .Wrapf (err , "failed to decompress copy for layer %d" , idx )
295
+ waitGroup .Wait ()
296
+ close (results )
297
+ for result := range results {
298
+ if result != nil {
299
+ return result
281
300
}
282
- logrus .Infof ("downloaded layer %d" , idx )
301
+ }
302
+
303
+ lastDigest := ""
304
+ for idx , layer := range manifest .Layers {
305
+ layerDir := path .Join (dir , fmt .Sprintf ("%04d_" , idx )+ layer .Digest .String ())
283
306
// TODO check diffID
284
307
285
308
// make writable layer
@@ -323,9 +346,14 @@ func convert() error {
323
346
}
324
347
logrus .Infof ("layer %d uploaded" , idx )
325
348
326
- lastDigest = manifest .Layers [idx ].Digest .String ()
349
+ lastDigest = fmt . Sprintf ( "%04d_" , idx ) + manifest .Layers [idx ].Digest .String ()
327
350
manifest .Layers [idx ] = desc
328
351
config .RootFS .DiffIDs [idx ] = desc .Digest
352
+
353
+ // clean unused file
354
+ os .Remove (path .Join (dir , lastDigest , "layer.tar" ))
355
+ os .Remove (path .Join (dir , lastDigest , "writable_data" ))
356
+ os .Remove (path .Join (dir , lastDigest , "writable_index" ))
329
357
}
330
358
331
359
// add baselayer
0 commit comments