Add support for content labels on commit

Add commit options which allow for setting labels on commit.
Prevents potential race between garbage collector reading labels
after commit and labels getting set.

Signed-off-by: Derek McGowan <derek@mcgstyle.net>
This commit is contained in:
Derek McGowan
2017-08-09 22:34:05 -07:00
parent c4387a159e
commit dee8dc2cda
11 changed files with 336 additions and 76 deletions

View File

@@ -352,7 +352,7 @@ type namespacedWriter struct {
db *bolt.DB
}
func (nw *namespacedWriter) Commit(size int64, expected digest.Digest) error {
func (nw *namespacedWriter) Commit(size int64, expected digest.Digest, opts ...content.Opt) error {
return nw.db.Update(func(tx *bolt.Tx) error {
bkt := getIngestBucket(tx, nw.namespace)
if bkt != nil {
@@ -360,11 +360,17 @@ func (nw *namespacedWriter) Commit(size int64, expected digest.Digest) error {
return err
}
}
return nw.commit(tx, size, expected)
return nw.commit(tx, size, expected, opts...)
})
}
func (nw *namespacedWriter) commit(tx *bolt.Tx, size int64, expected digest.Digest) error {
func (nw *namespacedWriter) commit(tx *bolt.Tx, size int64, expected digest.Digest, opts ...content.Opt) error {
var base content.Info
for _, opt := range opts {
if err := opt(&base); err != nil {
return err
}
}
status, err := nw.Writer.Status()
if err != nil {
return err
@@ -400,6 +406,9 @@ func (nw *namespacedWriter) commit(tx *bolt.Tx, size int64, expected digest.Dige
if err := boltutil.WriteTimestamps(bkt, commitTime, commitTime); err != nil {
return err
}
if err := boltutil.WriteLabels(bkt, base.Labels); err != nil {
return err
}
if err := bkt.Put(bucketKeySize, sizeEncoded); err != nil {
return err
}

View File

@@ -30,4 +30,5 @@ func createContentStore(ctx context.Context, root string) (content.Store, func()
func TestContent(t *testing.T) {
testsuite.ContentSuite(t, "metadata", createContentStore)
testsuite.ContentLabelSuite(t, "metadata", createContentStore)
}