@@ -323,6 +323,7 @@ func (s *snapshotter) createSnapshot(ctx context.Context, key, parent string, re
323
323
bopts = []snapshots.Opt {
324
324
snapshots .WithLabels (snapshots .FilterInheritedLabels (base .Labels )),
325
325
}
326
+ rerr error
326
327
)
327
328
328
329
if err := update (ctx , s .db , func (tx * bolt.Tx ) error {
@@ -334,12 +335,20 @@ func (s *snapshotter) createSnapshot(ctx context.Context, key, parent string, re
334
335
// Check if target exists, if so, return already exists
335
336
if target != "" {
336
337
if tbkt := bkt .Bucket ([]byte (target )); tbkt != nil {
337
- return fmt .Errorf ("target snapshot %q: %w" , target , errdefs .ErrAlreadyExists )
338
+ rerr = fmt .Errorf ("target snapshot %q: %w" , target , errdefs .ErrAlreadyExists )
339
+ if err := addSnapshotLease (ctx , tx , s .name , target ); err != nil {
340
+ return err
341
+ }
342
+ return nil
338
343
}
339
344
}
340
345
341
346
if bbkt := bkt .Bucket ([]byte (key )); bbkt != nil {
342
- return fmt .Errorf ("snapshot %q: %w" , key , errdefs .ErrAlreadyExists )
347
+ rerr = fmt .Errorf ("snapshot %q: %w" , key , errdefs .ErrAlreadyExists )
348
+ if err := addSnapshotLease (ctx , tx , s .name , key ); err != nil {
349
+ return err
350
+ }
351
+ return nil
343
352
}
344
353
345
354
if parent != "" {
@@ -360,11 +369,14 @@ func (s *snapshotter) createSnapshot(ctx context.Context, key, parent string, re
360
369
}); err != nil {
361
370
return nil , err
362
371
}
372
+ // Already exists and lease successfully added in transaction
373
+ if rerr != nil {
374
+ return nil , rerr
375
+ }
363
376
364
377
var (
365
378
m []mount.Mount
366
379
created string
367
- rerr error
368
380
)
369
381
if readonly {
370
382
m , err = s .Snapshotter .View (ctx , bkey , bparent , bopts ... )
@@ -527,24 +539,28 @@ func (s *snapshotter) Commit(ctx context.Context, name, key string, opts ...snap
527
539
return err
528
540
}
529
541
530
- var bname string
542
+ var (
543
+ bname string
544
+ rerr error
545
+ )
531
546
if err := update (ctx , s .db , func (tx * bolt.Tx ) error {
532
547
bkt := getSnapshotterBucket (tx , ns , s .name )
533
548
if bkt == nil {
534
549
return fmt .Errorf ("can not find snapshotter %q: %w" ,
535
550
s .name , errdefs .ErrNotFound )
536
551
}
537
552
553
+ if err := addSnapshotLease (ctx , tx , s .name , name ); err != nil {
554
+ return err
555
+ }
538
556
bbkt , err := bkt .CreateBucket ([]byte (name ))
539
557
if err != nil {
540
558
if err == bolt .ErrBucketExists {
541
- err = fmt .Errorf ("snapshot %q: %w" , name , errdefs .ErrAlreadyExists )
559
+ rerr = fmt .Errorf ("snapshot %q: %w" , name , errdefs .ErrAlreadyExists )
560
+ return nil
542
561
}
543
562
return err
544
563
}
545
- if err := addSnapshotLease (ctx , tx , s .name , name ); err != nil {
546
- return err
547
- }
548
564
549
565
obkt := bkt .Bucket ([]byte (key ))
550
566
if obkt == nil {
@@ -634,17 +650,19 @@ func (s *snapshotter) Commit(ctx context.Context, name, key string, opts ...snap
634
650
return err
635
651
}
636
652
637
- if publisher := s .db .Publisher (ctx ); publisher != nil {
638
- if err := publisher .Publish (ctx , "/snapshot/commit" , & eventstypes.SnapshotCommit {
639
- Key : key ,
640
- Name : name ,
641
- Snapshotter : s .name ,
642
- }); err != nil {
643
- return err
653
+ if rerr == nil {
654
+ if publisher := s .db .Publisher (ctx ); publisher != nil {
655
+ if err := publisher .Publish (ctx , "/snapshot/commit" , & eventstypes.SnapshotCommit {
656
+ Key : key ,
657
+ Name : name ,
658
+ Snapshotter : s .name ,
659
+ }); err != nil {
660
+ return err
661
+ }
644
662
}
645
663
}
646
664
647
- return nil
665
+ return rerr
648
666
649
667
}
650
668
0 commit comments