Merge pull request #2691 from fuweid/bugfix_cache_empty_label

bugfix: cache empty layer for docker schema1 image
This commit is contained in:
Michael Crosby 2018-10-15 15:43:23 -04:00 committed by GitHub
commit 5993d096ff
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -24,6 +24,7 @@ import (
"fmt" "fmt"
"io" "io"
"io/ioutil" "io/ioutil"
"strconv"
"strings" "strings"
"sync" "sync"
"time" "time"
@ -42,7 +43,10 @@ import (
"github.com/pkg/errors" "github.com/pkg/errors"
) )
const manifestSizeLimit = 8e6 // 8MB const (
manifestSizeLimit = 8e6 // 8MB
labelDockerSchema1EmptyLayer = "containerd.io/docker.schema1.empty-layer"
)
type blobState struct { type blobState struct {
diffID digest.Digest diffID digest.Digest
@ -353,10 +357,11 @@ func (c *Converter) fetchBlob(ctx context.Context, desc ocispec.Descriptor) erro
Digest: desc.Digest, Digest: desc.Digest,
Labels: map[string]string{ Labels: map[string]string{
"containerd.io/uncompressed": state.diffID.String(), "containerd.io/uncompressed": state.diffID.String(),
labelDockerSchema1EmptyLayer: strconv.FormatBool(state.empty),
}, },
} }
if _, err := c.contentStore.Update(ctx, cinfo, "labels.containerd.io/uncompressed"); err != nil { if _, err := c.contentStore.Update(ctx, cinfo, "labels.containerd.io/uncompressed", fmt.Sprintf("labels.%s", labelDockerSchema1EmptyLayer)); err != nil {
return errors.Wrap(err, "failed to update uncompressed label") return errors.Wrap(err, "failed to update uncompressed label")
} }
@ -380,7 +385,18 @@ func (c *Converter) reuseLabelBlobState(ctx context.Context, desc ocispec.Descri
return false, nil return false, nil
} }
bState := blobState{empty: false} emptyVal, ok := cinfo.Labels[labelDockerSchema1EmptyLayer]
if !ok {
return false, nil
}
isEmpty, err := strconv.ParseBool(emptyVal)
if err != nil {
log.G(ctx).WithField("id", desc.Digest).Warnf("failed to parse bool from label %s: %v", labelDockerSchema1EmptyLayer, isEmpty)
return false, nil
}
bState := blobState{empty: isEmpty}
if bState.diffID, err = digest.Parse(diffID); err != nil { if bState.diffID, err = digest.Parse(diffID); err != nil {
log.G(ctx).WithField("id", desc.Digest).Warnf("failed to parse digest from label containerd.io/uncompressed: %v", diffID) log.G(ctx).WithField("id", desc.Digest).Warnf("failed to parse digest from label containerd.io/uncompressed: %v", diffID)