Skip to content

Commit 9fd9592

Browse files
committed
fix(merge): add blob.meta to bootstrap in merge function
Signed-off-by: Fan Shang <[email protected]>
1 parent c9b930c commit 9fd9592

File tree

1 file changed

+83
-15
lines changed

1 file changed

+83
-15
lines changed

pkg/converter/convert_unix.go

Lines changed: 83 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -564,12 +564,27 @@ func Merge(ctx context.Context, layers []Layer, dest io.Writer, opt MergeOption)
564564
}
565565
defer os.RemoveAll(workDir)
566566

567-
getBootstrapPath := func(layerIdx int) string {
568-
digestHex := layers[layerIdx].Digest.Hex()
569-
if originalDigest := layers[layerIdx].OriginalDigest; originalDigest != nil {
570-
return filepath.Join(workDir, originalDigest.Hex())
567+
getLayerPath := func(layerIdx int, suffix string) string {
568+
var digestHex string
569+
if suffix == "" && layers[layerIdx].OriginalDigest != nil {
570+
digestHex = layers[layerIdx].OriginalDigest.Hex()
571+
} else {
572+
digestHex = layers[layerIdx].Digest.Hex()
571573
}
572-
return filepath.Join(workDir, digestHex)
574+
return filepath.Join(workDir, digestHex+suffix)
575+
}
576+
577+
unpackLayerEntry := func(layerIdx int, entryName string, filePath string) error {
578+
file, err := os.Create(filePath)
579+
if err != nil {
580+
return errors.Wrapf(err, "create %s file", entryName)
581+
}
582+
defer file.Close()
583+
584+
if _, err := UnpackEntry(layers[layerIdx].ReaderAt, entryName, file); err != nil {
585+
return errors.Wrapf(err, "unpack %s", entryName)
586+
}
587+
return nil
573588
}
574589

575590
eg, _ := errgroup.WithContext(ctx)
@@ -578,7 +593,7 @@ func Merge(ctx context.Context, layers []Layer, dest io.Writer, opt MergeOption)
578593
rafsBlobSizes := []int64{}
579594
rafsBlobTOCDigests := []string{}
580595
for idx := range layers {
581-
sourceBootstrapPaths = append(sourceBootstrapPaths, getBootstrapPath(idx))
596+
sourceBootstrapPaths = append(sourceBootstrapPaths, getLayerPath(idx, ""))
582597
if layers[idx].OriginalDigest != nil {
583598
rafsBlobTOCDigest, err := calcBlobTOCDigest(layers[idx].ReaderAt)
584599
if err != nil {
@@ -591,14 +606,18 @@ func Merge(ctx context.Context, layers []Layer, dest io.Writer, opt MergeOption)
591606
eg.Go(func(idx int) func() error {
592607
return func() error {
593608
// Use the hex hash string of whole tar blob as the bootstrap name.
594-
bootstrap, err := os.Create(getBootstrapPath(idx))
595-
if err != nil {
596-
return errors.Wrap(err, "create source bootstrap")
609+
if err := unpackLayerEntry(idx, EntryBootstrap, getLayerPath(idx, "")); err != nil {
610+
return err
597611
}
598-
defer bootstrap.Close()
599612

600-
if _, err := UnpackEntry(layers[idx].ReaderAt, EntryBootstrap, bootstrap); err != nil {
601-
return errors.Wrap(err, "unpack nydus tar")
613+
if opt.FsVersion == "6" {
614+
if err := unpackLayerEntry(idx, EntryBlobMeta, getLayerPath(idx, ".blob.meta")); err != nil {
615+
return err
616+
}
617+
618+
if err := unpackLayerEntry(idx, EntryBlobMetaHeader, getLayerPath(idx, ".blob.meta.header")); err != nil {
619+
return err
620+
}
602621
}
603622

604623
return nil
@@ -637,13 +656,63 @@ func Merge(ctx context.Context, layers []Layer, dest io.Writer, opt MergeOption)
637656
}
638657
defer bootstrapRa.Close()
639658

640-
files := append([]File{
659+
files := []File{
641660
{
642661
Name: EntryBootstrap,
643662
Reader: content.NewReader(bootstrapRa),
644663
Size: bootstrapRa.Size(),
645664
},
646-
}, opt.AppendFiles...)
665+
}
666+
667+
if opt.FsVersion == "6" {
668+
metaRas := make([]io.Closer, 0, len(layers)*2)
669+
defer func() {
670+
for _, closer := range metaRas {
671+
closer.Close()
672+
}
673+
}()
674+
675+
for idx := range layers {
676+
digestHex := layers[idx].Digest.Hex()
677+
blobMetaPath := getLayerPath(idx, ".blob.meta")
678+
_, err := os.Stat(blobMetaPath)
679+
if err != nil {
680+
return nil, errors.Wrap(err, "check blob.meta existence")
681+
}
682+
683+
metaRa, err := local.OpenReader(blobMetaPath)
684+
if err != nil {
685+
return nil, errors.Wrap(err, "open blob.meta")
686+
}
687+
688+
metaRas = append(metaRas, metaRa)
689+
files = append(files, File{
690+
Name: fmt.Sprintf("%s.%s", digestHex, EntryBlobMeta),
691+
Reader: content.NewReader(metaRa),
692+
Size: metaRa.Size(),
693+
})
694+
695+
getBlobMetaHeaderPath := getLayerPath(idx, ".blob.meta.header")
696+
_, err = os.Stat(getBlobMetaHeaderPath)
697+
if err != nil {
698+
return nil, errors.Wrap(err, "check blob.meta.header existence")
699+
}
700+
701+
metaHeaderRa, err := local.OpenReader((getBlobMetaHeaderPath))
702+
if err != nil {
703+
return nil, errors.Wrap(err, "open blob.meta.header")
704+
}
705+
metaRas = append(metaRas, metaHeaderRa)
706+
707+
files = append(files, File{
708+
Name: fmt.Sprintf("%s.%s", digestHex, EntryBlobMetaHeader),
709+
Reader: content.NewReader(metaHeaderRa),
710+
Size: metaHeaderRa.Size(),
711+
})
712+
}
713+
}
714+
715+
files = append(files, opt.AppendFiles...)
647716
var rc io.ReadCloser
648717

649718
if opt.WithTar {
@@ -661,7 +730,6 @@ func Merge(ctx context.Context, layers []Layer, dest io.Writer, opt MergeOption)
661730
if _, err = io.CopyBuffer(dest, rc, *buffer); err != nil {
662731
return nil, errors.Wrap(err, "copy merged bootstrap")
663732
}
664-
665733
return blobDigests, nil
666734
}
667735

0 commit comments

Comments
 (0)