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 <derek@mcgstyle.net>
This commit is contained in:
		| @@ -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 | ||||
| @@ -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 { | ||||
|   | ||||
| @@ -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) | ||||
| } | ||||
|   | ||||
| @@ -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) | ||||
| 	} | ||||
|  | ||||
|   | ||||
| @@ -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) | ||||
| 	} | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Derek McGowan
					Derek McGowan