Skip to content

Commit 1efe320

Browse files
authored
Merge pull request #158 from yuchen0cc/main
convertor: using append file instead of sparse file in lsmt
2 parents e0c8d45 + 2398ab8 commit 1efe320

File tree

1 file changed

+50
-22
lines changed

1 file changed

+50
-22
lines changed

cmd/convertor/main.go

Lines changed: 50 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
"path"
3030
"path/filepath"
3131
"strings"
32+
"sync"
3233

3334
"github.com/containerd/accelerated-container-image/pkg/snapshot"
3435
"github.com/containerd/containerd/archive/compression"
@@ -72,7 +73,7 @@ func prepareWritableLayer(ctx context.Context, dir string) error {
7273
indexPath := path.Join(dir, "writable_index")
7374
os.RemoveAll(dataPath)
7475
os.RemoveAll(indexPath)
75-
out, err := exec.CommandContext(ctx, binpath, "-s",
76+
out, err := exec.CommandContext(ctx, binpath,
7677
dataPath, indexPath, "64").CombinedOutput()
7778
if err != nil {
7879
return errors.Wrapf(err, "failed to prepare writable layer: %s", out)
@@ -257,29 +258,51 @@ func convert() error {
257258
File: "/opt/overlaybd/baselayers/ext4_64",
258259
})
259260

260-
lastDigest := ""
261+
results := make(chan error)
262+
var waitGroup sync.WaitGroup
263+
waitGroup.Add(len(manifest.Layers))
261264
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+
}
274294

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
281300
}
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())
283306
// TODO check diffID
284307

285308
// make writable layer
@@ -323,9 +346,14 @@ func convert() error {
323346
}
324347
logrus.Infof("layer %d uploaded", idx)
325348

326-
lastDigest = manifest.Layers[idx].Digest.String()
349+
lastDigest = fmt.Sprintf("%04d_", idx) + manifest.Layers[idx].Digest.String()
327350
manifest.Layers[idx] = desc
328351
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"))
329357
}
330358

331359
// add baselayer

0 commit comments

Comments
 (0)