From ad72036e58081edbc21b2aecea530402e324d71b Mon Sep 17 00:00:00 2001 From: Derek McGowan Date: Fri, 28 Jul 2017 15:48:02 -0700 Subject: [PATCH] Refactor common boltdb fields to subpackage Moves label and timestamp bolt functions to subpackage for use outside the metadata package without importing metadata package. Signed-off-by: Derek McGowan --- metadata/{ => boltutil}/helpers.go | 39 +++++++++++++++++++++++------- metadata/buckets.go | 3 --- metadata/containers.go | 32 ++++++++++-------------- metadata/content.go | 33 ++++++++++--------------- metadata/images.go | 17 ++++++------- 5 files changed, 64 insertions(+), 60 deletions(-) rename metadata/{ => boltutil}/helpers.go (58%) diff --git a/metadata/helpers.go b/metadata/boltutil/helpers.go similarity index 58% rename from metadata/helpers.go rename to metadata/boltutil/helpers.go index 063a0a54b..b713132dc 100644 --- a/metadata/helpers.go +++ b/metadata/boltutil/helpers.go @@ -1,4 +1,4 @@ -package metadata +package boltutil import ( "time" @@ -7,19 +7,36 @@ import ( "github.com/pkg/errors" ) -func readLabels(m map[string]string, bkt *bolt.Bucket) error { - return bkt.ForEach(func(k, v []byte) error { - m[string(k)] = string(v) +var ( + bucketKeyLabels = []byte("labels") + bucketKeyCreatedAt = []byte("createdat") + bucketKeyUpdatedAt = []byte("updatedat") +) + +// ReadLabels reads the labels key from the bucket +// Uses the key "labels" +func ReadLabels(bkt *bolt.Bucket) (map[string]string, error) { + lbkt := bkt.Bucket(bucketKeyLabels) + if lbkt == nil { + return nil, nil + } + labels := map[string]string{} + if err := lbkt.ForEach(func(k, v []byte) error { + labels[string(k)] = string(v) return nil - }) + }); err != nil { + return nil, err + } + return labels, nil } -// writeLabels will write a new labels bucket to the provided bucket at key +// WriteLabels will write a new labels bucket to the provided bucket at key // bucketKeyLabels, replacing the contents of the bucket with the provided map. // // The provide map labels will be modified to have the final contents of the // bucket. Typically, this removes zero-value entries. -func writeLabels(bkt *bolt.Bucket, labels map[string]string) error { +// Uses the key "labels" +func WriteLabels(bkt *bolt.Bucket, labels map[string]string) error { // Remove existing labels to keep from merging if lbkt := bkt.Bucket(bucketKeyLabels); lbkt != nil { if err := bkt.DeleteBucket(bucketKeyLabels); err != nil { @@ -50,7 +67,9 @@ func writeLabels(bkt *bolt.Bucket, labels map[string]string) error { return nil } -func readTimestamps(created, updated *time.Time, bkt *bolt.Bucket) error { +// ReadTimestamps reads created and updated timestamps from a bucket. +// Uses keys "createdat" and "updatedat" +func ReadTimestamps(bkt *bolt.Bucket, created, updated *time.Time) error { for _, f := range []struct { b []byte t *time.Time @@ -68,7 +87,9 @@ func readTimestamps(created, updated *time.Time, bkt *bolt.Bucket) error { return nil } -func writeTimestamps(bkt *bolt.Bucket, created, updated time.Time) error { +// WriteTimestamps writes created and updated timestamps to a bucket. +// Uses keys "createdat" and "updatedat" +func WriteTimestamps(bkt *bolt.Bucket, created, updated time.Time) error { createdAt, err := created.MarshalBinary() if err != nil { return err diff --git a/metadata/buckets.go b/metadata/buckets.go index 0ba3126bb..4bbcbe043 100644 --- a/metadata/buckets.go +++ b/metadata/buckets.go @@ -41,7 +41,6 @@ var ( bucketKeyDigest = []byte("digest") bucketKeyMediaType = []byte("mediatype") bucketKeySize = []byte("size") - bucketKeyLabels = []byte("labels") bucketKeyImage = []byte("image") bucketKeyRuntime = []byte("runtime") bucketKeyName = []byte("name") @@ -49,8 +48,6 @@ var ( bucketKeySpec = []byte("spec") bucketKeyRootFS = []byte("rootfs") bucketKeyTarget = []byte("target") - bucketKeyCreatedAt = []byte("createdat") - bucketKeyUpdatedAt = []byte("updatedat") ) func getBucket(tx *bolt.Tx, keys ...[]byte) *bolt.Bucket { diff --git a/metadata/containers.go b/metadata/containers.go index a951066ba..6061cd48f 100644 --- a/metadata/containers.go +++ b/metadata/containers.go @@ -10,6 +10,7 @@ import ( "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/filters" "github.com/containerd/containerd/identifiers" + "github.com/containerd/containerd/metadata/boltutil" "github.com/containerd/containerd/namespaces" "github.com/gogo/protobuf/proto" "github.com/gogo/protobuf/types" @@ -206,6 +207,16 @@ func (s *containerStore) Delete(ctx context.Context, id string) error { } func readContainer(container *containers.Container, bkt *bolt.Bucket) error { + labels, err := boltutil.ReadLabels(bkt) + if err != nil { + return err + } + container.Labels = labels + + if err := boltutil.ReadTimestamps(bkt, &container.CreatedAt, &container.UpdatedAt); err != nil { + return err + } + return bkt.ForEach(func(k, v []byte) error { switch string(k) { case string(bucketKeyImage): @@ -239,24 +250,7 @@ func readContainer(container *containers.Container, bkt *bolt.Bucket) error { container.Spec = &any case string(bucketKeyRootFS): container.RootFS = string(v) - case string(bucketKeyCreatedAt): - if err := container.CreatedAt.UnmarshalBinary(v); err != nil { - return err - } - case string(bucketKeyUpdatedAt): - if err := container.UpdatedAt.UnmarshalBinary(v); err != nil { - return err - } - case string(bucketKeyLabels): - lbkt := bkt.Bucket(bucketKeyLabels) - if lbkt == nil { - return nil - } - container.Labels = map[string]string{} - if err := readLabels(container.Labels, lbkt); err != nil { - return err - } } return nil @@ -264,7 +258,7 @@ func readContainer(container *containers.Container, bkt *bolt.Bucket) error { } func writeContainer(bkt *bolt.Bucket, container *containers.Container) error { - if err := writeTimestamps(bkt, container.CreatedAt, container.UpdatedAt); err != nil { + if err := boltutil.WriteTimestamps(bkt, container.CreatedAt, container.UpdatedAt); err != nil { return err } @@ -314,5 +308,5 @@ func writeContainer(bkt *bolt.Bucket, container *containers.Container) error { } } - return writeLabels(bkt, container.Labels) + return boltutil.WriteLabels(bkt, container.Labels) } diff --git a/metadata/content.go b/metadata/content.go index 811a91912..24b69d090 100644 --- a/metadata/content.go +++ b/metadata/content.go @@ -11,6 +11,7 @@ import ( "github.com/containerd/containerd/content" "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/filters" + "github.com/containerd/containerd/metadata/boltutil" "github.com/containerd/containerd/namespaces" digest "github.com/opencontainers/go-digest" "github.com/pkg/errors" @@ -390,24 +391,18 @@ func (nw *namespacedWriter) commit(tx *bolt.Tx, size int64, expected digest.Dige return err } + commitTime := time.Now().UTC() + sizeEncoded, err := encodeSize(size) if err != nil { return err } - timeEncoded, err := time.Now().UTC().MarshalBinary() - if err != nil { + if err := boltutil.WriteTimestamps(bkt, commitTime, commitTime); err != nil { return err } - - for _, v := range [][2][]byte{ - {bucketKeyCreatedAt, timeEncoded}, - {bucketKeyUpdatedAt, timeEncoded}, - {bucketKeySize, sizeEncoded}, - } { - if err := bkt.Put(v[0], v[1]); err != nil { - return err - } + if err := bkt.Put(bucketKeySize, sizeEncoded); err != nil { + return err } return nil @@ -451,17 +446,15 @@ func (cs *contentStore) checkAccess(ctx context.Context, dgst digest.Digest) err } func readInfo(info *content.Info, bkt *bolt.Bucket) error { - if err := readTimestamps(&info.CreatedAt, &info.UpdatedAt, bkt); err != nil { + if err := boltutil.ReadTimestamps(bkt, &info.CreatedAt, &info.UpdatedAt); err != nil { return err } - lbkt := bkt.Bucket(bucketKeyLabels) - if lbkt != nil { - info.Labels = map[string]string{} - if err := readLabels(info.Labels, lbkt); err != nil { - return err - } + labels, err := boltutil.ReadLabels(bkt) + if err != nil { + return err } + info.Labels = labels if v := bkt.Get(bucketKeySize); len(v) > 0 { info.Size, _ = binary.Varint(v) @@ -471,11 +464,11 @@ func readInfo(info *content.Info, bkt *bolt.Bucket) error { } func writeInfo(info *content.Info, bkt *bolt.Bucket) error { - if err := writeTimestamps(bkt, info.CreatedAt, info.UpdatedAt); err != nil { + if err := boltutil.WriteTimestamps(bkt, info.CreatedAt, info.UpdatedAt); err != nil { return err } - if err := writeLabels(bkt, info.Labels); err != nil { + if err := boltutil.WriteLabels(bkt, info.Labels); err != nil { return errors.Wrapf(err, "writing labels for info %v", info.Digest) } diff --git a/metadata/images.go b/metadata/images.go index 1815af396..a44b3a7f4 100644 --- a/metadata/images.go +++ b/metadata/images.go @@ -11,6 +11,7 @@ import ( "github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/filters" "github.com/containerd/containerd/images" + "github.com/containerd/containerd/metadata/boltutil" "github.com/containerd/containerd/namespaces" digest "github.com/opencontainers/go-digest" "github.com/pkg/errors" @@ -191,17 +192,15 @@ func (s *imageStore) Delete(ctx context.Context, name string) error { } func readImage(image *images.Image, bkt *bolt.Bucket) error { - if err := readTimestamps(&image.CreatedAt, &image.UpdatedAt, bkt); err != nil { + if err := boltutil.ReadTimestamps(bkt, &image.CreatedAt, &image.UpdatedAt); err != nil { return err } - lbkt := bkt.Bucket(bucketKeyLabels) - if lbkt != nil { - image.Labels = map[string]string{} - if err := readLabels(image.Labels, lbkt); err != nil { - return err - } + labels, err := boltutil.ReadLabels(bkt) + if err != nil { + return err } + image.Labels = labels tbkt := bkt.Bucket(bucketKeyTarget) if tbkt == nil { @@ -228,11 +227,11 @@ func readImage(image *images.Image, bkt *bolt.Bucket) error { } func writeImage(bkt *bolt.Bucket, image *images.Image) error { - if err := writeTimestamps(bkt, image.CreatedAt, image.UpdatedAt); err != nil { + if err := boltutil.WriteTimestamps(bkt, image.CreatedAt, image.UpdatedAt); err != nil { return err } - if err := writeLabels(bkt, image.Labels); err != nil { + if err := boltutil.WriteLabels(bkt, image.Labels); err != nil { return errors.Wrapf(err, "writing labels for image %v", image.Name) }