Skip to content

Commit c7fb8a9

Browse files
committed
Update metadata snapshotter to lease on exists
Currently the metadata snapshotter is not consistently adding keys to a lease when already exists is returned. When a lease is provided, any already exists errors should add the relevant key to the lease. It is not expected that clients must explicitly lease a key after calling Prepare/Commit. Signed-off-by: Derek McGowan <[email protected]>
1 parent 114ef75 commit c7fb8a9

File tree

1 file changed

+34
-16
lines changed

1 file changed

+34
-16
lines changed

core/metadata/snapshot.go

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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,17 +650,19 @@ func (s *snapshotter) Commit(ctx context.Context, name, key string, opts ...snap
634650
return err
635651
}
636652

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+
}
644662
}
645663
}
646664

647-
return nil
665+
return rerr
648666

649667
}
650668

0 commit comments

Comments
 (0)