diff --git a/cmd/etcdsnapshot/main.go b/cmd/etcdsnapshot/main.go index 38c0ed47d8..3d55ab6181 100644 --- a/cmd/etcdsnapshot/main.go +++ b/cmd/etcdsnapshot/main.go @@ -17,7 +17,8 @@ func main() { cmds.NewEtcdSnapshotSubcommands( etcdsnapshot.Delete, etcdsnapshot.List, - etcdsnapshot.Prune), + etcdsnapshot.Prune, + etcdsnapshot.Run), ), } diff --git a/cmd/k3s/main.go b/cmd/k3s/main.go index bbf13850c1..036cea3da9 100644 --- a/cmd/k3s/main.go +++ b/cmd/k3s/main.go @@ -46,6 +46,7 @@ func main() { cmds.NewCheckConfigCommand(externalCLIAction("check-config", dataDir)), cmds.NewEtcdSnapshotCommand(etcdsnapshotCommand, cmds.NewEtcdSnapshotSubcommands( + etcdsnapshotCommand, etcdsnapshotCommand, etcdsnapshotCommand, etcdsnapshotCommand), diff --git a/cmd/server/main.go b/cmd/server/main.go index 17fc818838..bd01b22be2 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -47,7 +47,8 @@ func main() { cmds.NewEtcdSnapshotSubcommands( etcdsnapshot.Delete, etcdsnapshot.List, - etcdsnapshot.Prune), + etcdsnapshot.Prune, + etcdsnapshot.Run), ), } diff --git a/main.go b/main.go index a1c09d7fed..8f9de71b21 100644 --- a/main.go +++ b/main.go @@ -31,7 +31,8 @@ func main() { cmds.NewEtcdSnapshotSubcommands( etcdsnapshot.Delete, etcdsnapshot.List, - etcdsnapshot.Prune), + etcdsnapshot.Prune, + etcdsnapshot.Run), ), } diff --git a/pkg/cli/cmds/etcd_snapshot.go b/pkg/cli/cmds/etcd_snapshot.go index b76a3b3ba1..6829e1122e 100644 --- a/pkg/cli/cmds/etcd_snapshot.go +++ b/pkg/cli/cmds/etcd_snapshot.go @@ -95,7 +95,7 @@ func NewEtcdSnapshotCommand(action func(*cli.Context) error, subcommands []cli.C } } -func NewEtcdSnapshotSubcommands(delete, list, prune func(ctx *cli.Context) error) []cli.Command { +func NewEtcdSnapshotSubcommands(delete, list, prune, save func(ctx *cli.Context) error) []cli.Command { return []cli.Command{ { Name: "delete", @@ -122,10 +122,22 @@ func NewEtcdSnapshotSubcommands(delete, list, prune func(ctx *cli.Context) error Action: prune, Flags: append(EtcdSnapshotFlags, &cli.IntFlag{ Name: "snapshot-retention", - Usage: "(db) Number of snapshots to retain", + Usage: "(db) Number of snapshots to retain. Default: 5", Destination: &ServerConfig.EtcdSnapshotRetention, Value: defaultSnapshotRentention, }), }, + { + Name: "save", + Usage: "Trigger an immediate etcd snapshot", + SkipFlagParsing: false, + SkipArgReorder: true, + Action: save, + Flags: append(EtcdSnapshotFlags, &cli.StringFlag{ + Name: "dir", + Usage: "(db) Directory to save etcd on-demand snapshot. (default: ${data-dir}/db/snapshots)", + Destination: &ServerConfig.EtcdSnapshotDir, + }), + }, } } diff --git a/pkg/cli/cmds/server.go b/pkg/cli/cmds/server.go index c8171a5a50..187dd305ab 100644 --- a/pkg/cli/cmds/server.go +++ b/pkg/cli/cmds/server.go @@ -252,7 +252,7 @@ func NewServerCommand(action func(*cli.Context) error) cli.Command { }, &cli.IntFlag{ Name: "etcd-snapshot-retention", - Usage: "(db) Number of snapshots to retain", + Usage: "(db) Number of snapshots to retain Default: 5", Destination: &ServerConfig.EtcdSnapshotRetention, Value: defaultSnapshotRentention, }, diff --git a/pkg/etcd/etcd.go b/pkg/etcd/etcd.go index 58dd1c9e9e..fa6f41f505 100644 --- a/pkg/etcd/etcd.go +++ b/pkg/etcd/etcd.go @@ -978,6 +978,14 @@ func (e *ETCD) PruneSnapshots(ctx context.Context) error { return errors.Wrap(err, "failed to get the snapshot dir") } + if e.config.EtcdS3 { + if e.initS3IfNil(ctx); err != nil { + return err + } + + return e.s3.snapshotRetention(ctx) + } + return snapshotRetention(e.config.EtcdSnapshotRetention, snapshotDir) } @@ -1009,12 +1017,13 @@ func (e *ETCD) DeleteSnapshots(ctx context.Context, snapshots []string) error { } objectsCh := make(chan minio.ObjectInfo) - defer close(objectsCh) ctx, cancel := context.WithTimeout(ctx, defaultS3OpTimeout) defer cancel() go func() { + defer close(objectsCh) + opts := minio.ListObjectsOptions{ Recursive: true, }