Skip to content

Commit 94e132f

Browse files
committed
Add sync option on lease removal
Signed-off-by: Derek McGowan <[email protected]>
1 parent 29b72d4 commit 94e132f

9 files changed

Lines changed: 167 additions & 43 deletions

File tree

api/next.pb.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2546,6 +2546,13 @@ file {
25462546
type: TYPE_STRING
25472547
json_name: "id"
25482548
}
2549+
field {
2550+
name: "sync"
2551+
number: 2
2552+
label: LABEL_OPTIONAL
2553+
type: TYPE_BOOL
2554+
json_name: "sync"
2555+
}
25492556
}
25502557
message_type {
25512558
name: "ListRequest"

api/services/leases/v1/leases.pb.go

Lines changed: 72 additions & 32 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/services/leases/v1/leases.proto

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ message CreateResponse {
4747

4848
message DeleteRequest {
4949
string id = 1;
50+
51+
// Sync indicates that the delete and cleanup should be done
52+
// synchronously before returning to the caller
53+
//
54+
// Default is false
55+
bool sync = 2;
5056
}
5157

5258
message ListRequest {

cmd/ctr/commands/leases/leases.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,12 @@ var deleteCommand = cli.Command{
163163
Usage: "delete a lease",
164164
ArgsUsage: "[flags] <lease id> ...",
165165
Description: "delete a lease",
166+
Flags: []cli.Flag{
167+
cli.BoolFlag{
168+
Name: "sync",
169+
Usage: "Synchronously remove leases and all unreferenced resources",
170+
},
171+
},
166172
Action: func(context *cli.Context) error {
167173
var lids = context.Args()
168174
if len(lids) == 0 {
@@ -175,11 +181,17 @@ var deleteCommand = cli.Command{
175181
defer cancel()
176182

177183
ls := client.LeasesService()
178-
for _, lid := range lids {
184+
sync := context.Bool("sync")
185+
for i, lid := range lids {
186+
var opts []leases.DeleteOpt
187+
if sync && i == len(lids)-1 {
188+
opts = append(opts, leases.SynchronousDelete)
189+
}
190+
179191
lease := leases.Lease{
180192
ID: lid,
181193
}
182-
if err := ls.Delete(ctx, lease); err != nil {
194+
if err := ls.Delete(ctx, lease, opts...); err != nil {
183195
return err
184196
}
185197
fmt.Println(lid)

leases/lease.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,13 @@ import (
2424
// Opt is used to set options on a lease
2525
type Opt func(*Lease) error
2626

27+
// DeleteOpt allows configuring a delete operation
28+
type DeleteOpt func(context.Context, *DeleteOptions) error
29+
2730
// Manager is used to create, list, and remove leases
2831
type Manager interface {
2932
Create(context.Context, ...Opt) (Lease, error)
30-
Delete(context.Context, Lease) error
33+
Delete(context.Context, Lease, ...DeleteOpt) error
3134
List(context.Context, ...string) ([]Lease, error)
3235
}
3336

@@ -39,6 +42,19 @@ type Lease struct {
3942
Labels map[string]string
4043
}
4144

45+
// DeleteOptions provide options on image delete
46+
type DeleteOptions struct {
47+
Synchronous bool
48+
}
49+
50+
// SynchronousDelete is used to indicate that a lease deletion and removal of
51+
// any unreferenced resources should occur synchronously before returning the
52+
// result.
53+
func SynchronousDelete(ctx context.Context, o *DeleteOptions) error {
54+
o.Synchronous = true
55+
return nil
56+
}
57+
4258
// WithLabels sets labels on a lease
4359
func WithLabels(labels map[string]string) Opt {
4460
return func(l *Lease) error {

leases/proxy/manager.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,17 @@ func (pm *proxyManager) Create(ctx context.Context, opts ...leases.Opt) (leases.
5757
}, nil
5858
}
5959

60-
func (pm *proxyManager) Delete(ctx context.Context, l leases.Lease) error {
60+
func (pm *proxyManager) Delete(ctx context.Context, l leases.Lease, opts ...leases.DeleteOpt) error {
61+
var do leases.DeleteOptions
62+
for _, opt := range opts {
63+
if err := opt(ctx, &do); err != nil {
64+
return err
65+
}
66+
}
67+
6168
_, err := pm.client.Delete(ctx, &leasesapi.DeleteRequest{
62-
ID: l.ID,
69+
ID: l.ID,
70+
Sync: do.Synchronous,
6371
})
6472
return err
6573
}

metadata/leases.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ func (lm *LeaseManager) Create(ctx context.Context, opts ...leases.Opt) (leases.
9494
}
9595

9696
// Delete delets the lease with the provided lease ID
97-
func (lm *LeaseManager) Delete(ctx context.Context, lease leases.Lease) error {
97+
func (lm *LeaseManager) Delete(ctx context.Context, lease leases.Lease, _ ...leases.DeleteOpt) error {
9898
namespace, err := namespaces.NamespaceRequired(ctx)
9999
if err != nil {
100100
return err

services/leases/local.go

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"context"
2121

2222
"github.com/boltdb/bolt"
23+
"github.com/containerd/containerd/gc"
2324
"github.com/containerd/containerd/leases"
2425
"github.com/containerd/containerd/metadata"
2526
"github.com/containerd/containerd/plugin"
@@ -38,13 +39,25 @@ func init() {
3839
if err != nil {
3940
return nil, err
4041
}
41-
return &local{db: m.(*metadata.DB)}, nil
42+
g, err := ic.Get(plugin.GCPlugin)
43+
if err != nil {
44+
return nil, err
45+
}
46+
return &local{
47+
db: m.(*metadata.DB),
48+
gc: g.(gcScheduler),
49+
}, nil
4250
},
4351
})
4452
}
4553

54+
type gcScheduler interface {
55+
ScheduleAndWait(context.Context) (gc.Stats, error)
56+
}
57+
4658
type local struct {
4759
db *metadata.DB
60+
gc gcScheduler
4861
}
4962

5063
func (l *local) Create(ctx context.Context, opts ...leases.Opt) (leases.Lease, error) {
@@ -59,10 +72,28 @@ func (l *local) Create(ctx context.Context, opts ...leases.Opt) (leases.Lease, e
5972
return lease, nil
6073
}
6174

62-
func (l *local) Delete(ctx context.Context, lease leases.Lease) error {
63-
return l.db.Update(func(tx *bolt.Tx) error {
75+
func (l *local) Delete(ctx context.Context, lease leases.Lease, opts ...leases.DeleteOpt) error {
76+
var do leases.DeleteOptions
77+
for _, opt := range opts {
78+
if err := opt(ctx, &do); err != nil {
79+
return err
80+
}
81+
}
82+
83+
if err := l.db.Update(func(tx *bolt.Tx) error {
6484
return metadata.NewLeaseManager(tx).Delete(ctx, lease)
65-
})
85+
}); err != nil {
86+
return err
87+
}
88+
89+
if do.Synchronous {
90+
if _, err := l.gc.ScheduleAndWait(ctx); err != nil {
91+
return err
92+
}
93+
}
94+
95+
return nil
96+
6697
}
6798

6899
func (l *local) List(ctx context.Context, filters ...string) ([]leases.Lease, error) {

services/leases/service.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,13 @@ func (s *service) Create(ctx context.Context, r *api.CreateRequest) (*api.Create
8484
}
8585

8686
func (s *service) Delete(ctx context.Context, r *api.DeleteRequest) (*ptypes.Empty, error) {
87+
var opts []leases.DeleteOpt
88+
if r.Sync {
89+
opts = append(opts, leases.SynchronousDelete)
90+
}
8791
if err := s.lm.Delete(ctx, leases.Lease{
8892
ID: r.ID,
89-
}); err != nil {
93+
}, opts...); err != nil {
9094
return nil, err
9195
}
9296
return &ptypes.Empty{}, nil

0 commit comments

Comments
 (0)