Skip to content

Commit ad72036

Browse files
committed
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>
1 parent c8b4e4d commit ad72036

File tree

5 files changed

+64
-60
lines changed

5 files changed

+64
-60
lines changed
Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package metadata
1+
package boltutil
22

33
import (
44
"time"
@@ -7,19 +7,36 @@ import (
77
"github.com/pkg/errors"
88
)
99

10-
func readLabels(m map[string]string, bkt *bolt.Bucket) error {
11-
return bkt.ForEach(func(k, v []byte) error {
12-
m[string(k)] = string(v)
10+
var (
11+
bucketKeyLabels = []byte("labels")
12+
bucketKeyCreatedAt = []byte("createdat")
13+
bucketKeyUpdatedAt = []byte("updatedat")
14+
)
15+
16+
// ReadLabels reads the labels key from the bucket
17+
// Uses the key "labels"
18+
func ReadLabels(bkt *bolt.Bucket) (map[string]string, error) {
19+
lbkt := bkt.Bucket(bucketKeyLabels)
20+
if lbkt == nil {
21+
return nil, nil
22+
}
23+
labels := map[string]string{}
24+
if err := lbkt.ForEach(func(k, v []byte) error {
25+
labels[string(k)] = string(v)
1326
return nil
14-
})
27+
}); err != nil {
28+
return nil, err
29+
}
30+
return labels, nil
1531
}
1632

17-
// writeLabels will write a new labels bucket to the provided bucket at key
33+
// WriteLabels will write a new labels bucket to the provided bucket at key
1834
// bucketKeyLabels, replacing the contents of the bucket with the provided map.
1935
//
2036
// The provide map labels will be modified to have the final contents of the
2137
// bucket. Typically, this removes zero-value entries.
22-
func writeLabels(bkt *bolt.Bucket, labels map[string]string) error {
38+
// Uses the key "labels"
39+
func WriteLabels(bkt *bolt.Bucket, labels map[string]string) error {
2340
// Remove existing labels to keep from merging
2441
if lbkt := bkt.Bucket(bucketKeyLabels); lbkt != nil {
2542
if err := bkt.DeleteBucket(bucketKeyLabels); err != nil {
@@ -50,7 +67,9 @@ func writeLabels(bkt *bolt.Bucket, labels map[string]string) error {
5067
return nil
5168
}
5269

53-
func readTimestamps(created, updated *time.Time, bkt *bolt.Bucket) error {
70+
// ReadTimestamps reads created and updated timestamps from a bucket.
71+
// Uses keys "createdat" and "updatedat"
72+
func ReadTimestamps(bkt *bolt.Bucket, created, updated *time.Time) error {
5473
for _, f := range []struct {
5574
b []byte
5675
t *time.Time
@@ -68,7 +87,9 @@ func readTimestamps(created, updated *time.Time, bkt *bolt.Bucket) error {
6887
return nil
6988
}
7089

71-
func writeTimestamps(bkt *bolt.Bucket, created, updated time.Time) error {
90+
// WriteTimestamps writes created and updated timestamps to a bucket.
91+
// Uses keys "createdat" and "updatedat"
92+
func WriteTimestamps(bkt *bolt.Bucket, created, updated time.Time) error {
7293
createdAt, err := created.MarshalBinary()
7394
if err != nil {
7495
return err

metadata/buckets.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,13 @@ var (
4141
bucketKeyDigest = []byte("digest")
4242
bucketKeyMediaType = []byte("mediatype")
4343
bucketKeySize = []byte("size")
44-
bucketKeyLabels = []byte("labels")
4544
bucketKeyImage = []byte("image")
4645
bucketKeyRuntime = []byte("runtime")
4746
bucketKeyName = []byte("name")
4847
bucketKeyOptions = []byte("options")
4948
bucketKeySpec = []byte("spec")
5049
bucketKeyRootFS = []byte("rootfs")
5150
bucketKeyTarget = []byte("target")
52-
bucketKeyCreatedAt = []byte("createdat")
53-
bucketKeyUpdatedAt = []byte("updatedat")
5451
)
5552

5653
func getBucket(tx *bolt.Tx, keys ...[]byte) *bolt.Bucket {

metadata/containers.go

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/containerd/containerd/errdefs"
1111
"github.com/containerd/containerd/filters"
1212
"github.com/containerd/containerd/identifiers"
13+
"github.com/containerd/containerd/metadata/boltutil"
1314
"github.com/containerd/containerd/namespaces"
1415
"github.com/gogo/protobuf/proto"
1516
"github.com/gogo/protobuf/types"
@@ -206,6 +207,16 @@ func (s *containerStore) Delete(ctx context.Context, id string) error {
206207
}
207208

208209
func readContainer(container *containers.Container, bkt *bolt.Bucket) error {
210+
labels, err := boltutil.ReadLabels(bkt)
211+
if err != nil {
212+
return err
213+
}
214+
container.Labels = labels
215+
216+
if err := boltutil.ReadTimestamps(bkt, &container.CreatedAt, &container.UpdatedAt); err != nil {
217+
return err
218+
}
219+
209220
return bkt.ForEach(func(k, v []byte) error {
210221
switch string(k) {
211222
case string(bucketKeyImage):
@@ -239,32 +250,15 @@ func readContainer(container *containers.Container, bkt *bolt.Bucket) error {
239250
container.Spec = &any
240251
case string(bucketKeyRootFS):
241252
container.RootFS = string(v)
242-
case string(bucketKeyCreatedAt):
243-
if err := container.CreatedAt.UnmarshalBinary(v); err != nil {
244-
return err
245-
}
246-
case string(bucketKeyUpdatedAt):
247-
if err := container.UpdatedAt.UnmarshalBinary(v); err != nil {
248-
return err
249-
}
250-
case string(bucketKeyLabels):
251-
lbkt := bkt.Bucket(bucketKeyLabels)
252-
if lbkt == nil {
253-
return nil
254-
}
255-
container.Labels = map[string]string{}
256253

257-
if err := readLabels(container.Labels, lbkt); err != nil {
258-
return err
259-
}
260254
}
261255

262256
return nil
263257
})
264258
}
265259

266260
func writeContainer(bkt *bolt.Bucket, container *containers.Container) error {
267-
if err := writeTimestamps(bkt, container.CreatedAt, container.UpdatedAt); err != nil {
261+
if err := boltutil.WriteTimestamps(bkt, container.CreatedAt, container.UpdatedAt); err != nil {
268262
return err
269263
}
270264

@@ -314,5 +308,5 @@ func writeContainer(bkt *bolt.Bucket, container *containers.Container) error {
314308
}
315309
}
316310

317-
return writeLabels(bkt, container.Labels)
311+
return boltutil.WriteLabels(bkt, container.Labels)
318312
}

metadata/content.go

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/containerd/containerd/content"
1212
"github.com/containerd/containerd/errdefs"
1313
"github.com/containerd/containerd/filters"
14+
"github.com/containerd/containerd/metadata/boltutil"
1415
"github.com/containerd/containerd/namespaces"
1516
digest "github.com/opencontainers/go-digest"
1617
"github.com/pkg/errors"
@@ -390,24 +391,18 @@ func (nw *namespacedWriter) commit(tx *bolt.Tx, size int64, expected digest.Dige
390391
return err
391392
}
392393

394+
commitTime := time.Now().UTC()
395+
393396
sizeEncoded, err := encodeSize(size)
394397
if err != nil {
395398
return err
396399
}
397400

398-
timeEncoded, err := time.Now().UTC().MarshalBinary()
399-
if err != nil {
401+
if err := boltutil.WriteTimestamps(bkt, commitTime, commitTime); err != nil {
400402
return err
401403
}
402-
403-
for _, v := range [][2][]byte{
404-
{bucketKeyCreatedAt, timeEncoded},
405-
{bucketKeyUpdatedAt, timeEncoded},
406-
{bucketKeySize, sizeEncoded},
407-
} {
408-
if err := bkt.Put(v[0], v[1]); err != nil {
409-
return err
410-
}
404+
if err := bkt.Put(bucketKeySize, sizeEncoded); err != nil {
405+
return err
411406
}
412407

413408
return nil
@@ -451,17 +446,15 @@ func (cs *contentStore) checkAccess(ctx context.Context, dgst digest.Digest) err
451446
}
452447

453448
func readInfo(info *content.Info, bkt *bolt.Bucket) error {
454-
if err := readTimestamps(&info.CreatedAt, &info.UpdatedAt, bkt); err != nil {
449+
if err := boltutil.ReadTimestamps(bkt, &info.CreatedAt, &info.UpdatedAt); err != nil {
455450
return err
456451
}
457452

458-
lbkt := bkt.Bucket(bucketKeyLabels)
459-
if lbkt != nil {
460-
info.Labels = map[string]string{}
461-
if err := readLabels(info.Labels, lbkt); err != nil {
462-
return err
463-
}
453+
labels, err := boltutil.ReadLabels(bkt)
454+
if err != nil {
455+
return err
464456
}
457+
info.Labels = labels
465458

466459
if v := bkt.Get(bucketKeySize); len(v) > 0 {
467460
info.Size, _ = binary.Varint(v)
@@ -471,11 +464,11 @@ func readInfo(info *content.Info, bkt *bolt.Bucket) error {
471464
}
472465

473466
func writeInfo(info *content.Info, bkt *bolt.Bucket) error {
474-
if err := writeTimestamps(bkt, info.CreatedAt, info.UpdatedAt); err != nil {
467+
if err := boltutil.WriteTimestamps(bkt, info.CreatedAt, info.UpdatedAt); err != nil {
475468
return err
476469
}
477470

478-
if err := writeLabels(bkt, info.Labels); err != nil {
471+
if err := boltutil.WriteLabels(bkt, info.Labels); err != nil {
479472
return errors.Wrapf(err, "writing labels for info %v", info.Digest)
480473
}
481474

metadata/images.go

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/containerd/containerd/errdefs"
1212
"github.com/containerd/containerd/filters"
1313
"github.com/containerd/containerd/images"
14+
"github.com/containerd/containerd/metadata/boltutil"
1415
"github.com/containerd/containerd/namespaces"
1516
digest "github.com/opencontainers/go-digest"
1617
"github.com/pkg/errors"
@@ -191,17 +192,15 @@ func (s *imageStore) Delete(ctx context.Context, name string) error {
191192
}
192193

193194
func readImage(image *images.Image, bkt *bolt.Bucket) error {
194-
if err := readTimestamps(&image.CreatedAt, &image.UpdatedAt, bkt); err != nil {
195+
if err := boltutil.ReadTimestamps(bkt, &image.CreatedAt, &image.UpdatedAt); err != nil {
195196
return err
196197
}
197198

198-
lbkt := bkt.Bucket(bucketKeyLabels)
199-
if lbkt != nil {
200-
image.Labels = map[string]string{}
201-
if err := readLabels(image.Labels, lbkt); err != nil {
202-
return err
203-
}
199+
labels, err := boltutil.ReadLabels(bkt)
200+
if err != nil {
201+
return err
204202
}
203+
image.Labels = labels
205204

206205
tbkt := bkt.Bucket(bucketKeyTarget)
207206
if tbkt == nil {
@@ -228,11 +227,11 @@ func readImage(image *images.Image, bkt *bolt.Bucket) error {
228227
}
229228

230229
func writeImage(bkt *bolt.Bucket, image *images.Image) error {
231-
if err := writeTimestamps(bkt, image.CreatedAt, image.UpdatedAt); err != nil {
230+
if err := boltutil.WriteTimestamps(bkt, image.CreatedAt, image.UpdatedAt); err != nil {
232231
return err
233232
}
234233

235-
if err := writeLabels(bkt, image.Labels); err != nil {
234+
if err := boltutil.WriteLabels(bkt, image.Labels); err != nil {
236235
return errors.Wrapf(err, "writing labels for image %v", image.Name)
237236
}
238237

0 commit comments

Comments
 (0)