@@ -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