@@ -323,6 +323,7 @@ func (s *snapshotter) createSnapshot(ctx context.Context, key, parent string, re
323323 bopts = []snapshots.Opt {
324324 snapshots .WithLabels (snapshots .FilterInheritedLabels (base .Labels )),
325325 }
326+ rerr error
326327 )
327328
328329 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
334335 // Check if target exists, if so, return already exists
335336 if target != "" {
336337 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
338343 }
339344 }
340345
341346 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
343352 }
344353
345354 if parent != "" {
@@ -360,11 +369,14 @@ func (s *snapshotter) createSnapshot(ctx context.Context, key, parent string, re
360369 }); err != nil {
361370 return nil , err
362371 }
372+ // Already exists and lease successfully added in transaction
373+ if rerr != nil {
374+ return nil , rerr
375+ }
363376
364377 var (
365378 m []mount.Mount
366379 created string
367- rerr error
368380 )
369381 if readonly {
370382 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
527539 return err
528540 }
529541
530- var bname string
542+ var (
543+ bname string
544+ rerr error
545+ )
531546 if err := update (ctx , s .db , func (tx * bolt.Tx ) error {
532547 bkt := getSnapshotterBucket (tx , ns , s .name )
533548 if bkt == nil {
534549 return fmt .Errorf ("can not find snapshotter %q: %w" ,
535550 s .name , errdefs .ErrNotFound )
536551 }
537552
553+ if err := addSnapshotLease (ctx , tx , s .name , name ); err != nil {
554+ return err
555+ }
538556 bbkt , err := bkt .CreateBucket ([]byte (name ))
539557 if err != nil {
540558 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
542561 }
543562 return err
544563 }
545- if err := addSnapshotLease (ctx , tx , s .name , name ); err != nil {
546- return err
547- }
548564
549565 obkt := bkt .Bucket ([]byte (key ))
550566 if obkt == nil {
@@ -634,7 +650,7 @@ func (s *snapshotter) Commit(ctx context.Context, name, key string, opts ...snap
634650 return err
635651 }
636652
637- if s .db .dbopts .publisher != nil {
653+ if rerr == nil && s .db .dbopts .publisher != nil {
638654 if err := s .db .dbopts .publisher .Publish (ctx , "/snapshot/commit" , & eventstypes.SnapshotCommit {
639655 Key : key ,
640656 Name : name ,
@@ -644,7 +660,7 @@ func (s *snapshotter) Commit(ctx context.Context, name, key string, opts ...snap
644660 }
645661 }
646662
647- return nil
663+ return rerr
648664
649665}
650666
0 commit comments