Update differ to support compressed archives

Differ is updated to set a label for the uncompressed hash
of compressed content. This allows compressed blobs to
be used and looked up for their uncompressed hashes.
Uses commit options to set labels.
Updates rootfs default to create compressed archives.

Signed-off-by: Derek McGowan <derek@mcgstyle.net>
This commit is contained in:
Derek McGowan 2017-08-09 22:35:49 -07:00
parent dee8dc2cda
commit da34812db6
No known key found for this signature in database
GPG Key ID: F58C5D0A4405ACDB
2 changed files with 32 additions and 18 deletions

View File

@ -102,7 +102,17 @@ func (s *BaseDiff) Apply(ctx context.Context, desc ocispec.Descriptor, mounts []
} }
func (s *BaseDiff) DiffMounts(ctx context.Context, lower, upper []mount.Mount, media, ref string) (ocispec.Descriptor, error) { func (s *BaseDiff) DiffMounts(ctx context.Context, lower, upper []mount.Mount, media, ref string) (ocispec.Descriptor, error) {
var isCompressed bool
switch media {
case ocispec.MediaTypeImageLayer:
case ocispec.MediaTypeImageLayerGzip:
isCompressed = true
case "":
media = ocispec.MediaTypeImageLayerGzip
isCompressed = true
default:
return emptyDesc, errors.Errorf("unsupported diff media type: %v", media)
}
aDir, err := ioutil.TempDir("", "left-") aDir, err := ioutil.TempDir("", "left-")
if err != nil { if err != nil {
return emptyDesc, errors.Wrap(err, "failed to create temporary directory") return emptyDesc, errors.Wrap(err, "failed to create temporary directory")
@ -130,25 +140,29 @@ func (s *BaseDiff) DiffMounts(ctx context.Context, lower, upper []mount.Mount, m
return emptyDesc, errors.Wrap(err, "failed to open writer") return emptyDesc, errors.Wrap(err, "failed to open writer")
} }
// TODO: Validate media type var opts []content.Opt
if isCompressed {
// TODO: Support compressed media types (link compressed to uncompressed) dgstr := digest.SHA256.Digester()
//dgstr := digest.SHA256.Digester() compressed, err := compression.CompressStream(cw, compression.Gzip)
//wc := &writeCounter{}
//compressed, err := compression.CompressStream(cw, compression.Gzip)
//if err != nil {
// return nil, errors.Wrap(err, "failed to get compressed stream")
//}
//err = archive.WriteDiff(ctx, io.MultiWriter(compressed, dgstr.Hash(), wc), lowerDir, upperDir)
//compressed.Close()
err = archive.WriteDiff(ctx, cw, aDir, bDir)
if err != nil { if err != nil {
return emptyDesc, errors.Wrap(err, "failed to get compressed stream")
}
err = archive.WriteDiff(ctx, io.MultiWriter(compressed, dgstr.Hash()), aDir, bDir)
compressed.Close()
if err != nil {
return emptyDesc, errors.Wrap(err, "failed to write compressed diff")
}
opts = append(opts, content.WithLabels(map[string]string{
"containerd.io/uncompressed": dgstr.Digest().String(),
}))
} else {
if err = archive.WriteDiff(ctx, cw, aDir, bDir); err != nil {
return emptyDesc, errors.Wrap(err, "failed to write diff") return emptyDesc, errors.Wrap(err, "failed to write diff")
} }
}
dgst := cw.Digest() dgst := cw.Digest()
if err := cw.Commit(0, dgst); err != nil { if err := cw.Commit(0, dgst, opts...); err != nil {
return emptyDesc, errors.Wrap(err, "failed to commit") return emptyDesc, errors.Wrap(err, "failed to commit")
} }

View File

@ -49,5 +49,5 @@ func Diff(ctx context.Context, snapshotID, contentRef string, sn snapshot.Snapsh
defer sn.Remove(ctx, lowerKey) defer sn.Remove(ctx, lowerKey)
} }
return md.DiffMounts(ctx, lower, upper, ocispec.MediaTypeImageLayer, contentRef) return md.DiffMounts(ctx, lower, upper, ocispec.MediaTypeImageLayerGzip, contentRef)
} }