X Tutup
Skip to content

Commit 00a121f

Browse files
dmcgowanestesp
authored andcommitted
Always check exists on commit error
Signed-off-by: Derek McGowan <derek@mcgstyle.net>
1 parent 57508dc commit 00a121f

File tree

6 files changed

+21
-21
lines changed

6 files changed

+21
-21
lines changed

content/local/writer.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,11 +132,11 @@ func (w *writer) Commit(ctx context.Context, size int64, expected digest.Digest,
132132
// clean up!!
133133
defer os.RemoveAll(w.path)
134134

135+
if _, err := os.Stat(target); err == nil {
136+
// collision with the target file!
137+
return errors.Wrapf(errdefs.ErrAlreadyExists, "content %v", dgst)
138+
}
135139
if err := os.Rename(ingest, target); err != nil {
136-
if os.IsExist(err) {
137-
// collision with the target file!
138-
return errors.Wrapf(errdefs.ErrAlreadyExists, "content %v", dgst)
139-
}
140140
return err
141141
}
142142
commitTime := time.Now()

diff/walking/differ.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,9 @@ func (s *walkingDiff) Compare(ctx context.Context, lower, upper []mount.Mount, o
135135

136136
dgst := cw.Digest()
137137
if err := cw.Commit(ctx, 0, dgst, commitopts...); err != nil {
138-
return errors.Wrap(err, "failed to commit")
138+
if !errdefs.IsAlreadyExists(err) {
139+
return errors.Wrap(err, "failed to commit")
140+
}
139141
}
140142

141143
info, err := s.store.Info(ctx, dgst)

metadata/buckets.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,11 +167,11 @@ func getSnapshotterBucket(tx *bolt.Tx, namespace, snapshotter string) *bolt.Buck
167167
}
168168

169169
func createBlobBucket(tx *bolt.Tx, namespace string, dgst digest.Digest) (*bolt.Bucket, error) {
170-
bkt, err := createBucketIfNotExists(tx, bucketKeyVersion, []byte(namespace), bucketKeyObjectContent, bucketKeyObjectBlob, []byte(dgst.String()))
170+
bkt, err := createBucketIfNotExists(tx, bucketKeyVersion, []byte(namespace), bucketKeyObjectContent, bucketKeyObjectBlob)
171171
if err != nil {
172172
return nil, err
173173
}
174-
return bkt, nil
174+
return bkt.CreateBucket([]byte(dgst.String()))
175175
}
176176

177177
func getBlobsBucket(tx *bolt.Tx, namespace string) *bolt.Bucket {

metadata/content.go

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -552,9 +552,6 @@ func (nw *namespacedWriter) commit(ctx context.Context, tx *bolt.Tx, size int64,
552552
}
553553
size = nw.size
554554
actual = nw.expected
555-
if getBlobBucket(tx, nw.namespace, actual) != nil {
556-
return "", errors.Wrapf(errdefs.ErrAlreadyExists, "content %v", actual)
557-
}
558555
} else {
559556
status, err := nw.w.Status()
560557
if err != nil {
@@ -566,18 +563,16 @@ func (nw *namespacedWriter) commit(ctx context.Context, tx *bolt.Tx, size int64,
566563
size = status.Offset
567564
actual = nw.w.Digest()
568565

569-
if err := nw.w.Commit(ctx, size, expected); err != nil {
570-
if !errdefs.IsAlreadyExists(err) {
571-
return "", err
572-
}
573-
if getBlobBucket(tx, nw.namespace, actual) != nil {
574-
return "", errors.Wrapf(errdefs.ErrAlreadyExists, "content %v", actual)
575-
}
566+
if err := nw.w.Commit(ctx, size, expected); err != nil && !errdefs.IsAlreadyExists(err) {
567+
return "", err
576568
}
577569
}
578570

579571
bkt, err := createBlobBucket(tx, nw.namespace, actual)
580572
if err != nil {
573+
if err == bolt.ErrBucketExists {
574+
return "", errors.Wrapf(errdefs.ErrAlreadyExists, "content %v", actual)
575+
}
581576
return "", err
582577
}
583578

services/content/service.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ func (s *service) Read(req *api.ReadContentRequest, session api.Content_ReadServ
212212
_, err = io.CopyBuffer(
213213
&readResponseWriter{session: session},
214214
io.NewSectionReader(ra, offset, size), *p)
215-
return err
215+
return errdefs.ToGRPC(err)
216216
}
217217

218218
// readResponseWriter is a writer that places the output into ReadContentRequest messages.
@@ -417,7 +417,7 @@ func (s *service) Write(session api.Content_WriteServer) (err error) {
417417
// maintain the offset as append only, we just issue the write.
418418
n, err := wr.Write(req.Data)
419419
if err != nil {
420-
return err
420+
return errdefs.ToGRPC(err)
421421
}
422422

423423
if n != len(req.Data) {
@@ -435,7 +435,7 @@ func (s *service) Write(session api.Content_WriteServer) (err error) {
435435
opts = append(opts, content.WithLabels(req.Labels))
436436
}
437437
if err := wr.Commit(ctx, total, expected, opts...); err != nil {
438-
return err
438+
return errdefs.ToGRPC(err)
439439
}
440440
}
441441

task.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -606,8 +606,11 @@ func writeContent(ctx context.Context, store content.Ingester, mediaType, ref st
606606
if err != nil {
607607
return d, err
608608
}
609+
609610
if err := writer.Commit(ctx, size, "", opts...); err != nil {
610-
return d, err
611+
if !errdefs.IsAlreadyExists(err) {
612+
return d, err
613+
}
611614
}
612615
return v1.Descriptor{
613616
MediaType: mediaType,

0 commit comments

Comments
 (0)
X Tutup