From 2c38dcef79b4427c7dce3e677751ca2e6700e1d4 Mon Sep 17 00:00:00 2001 From: Shreyas Rao Date: Mon, 11 Mar 2019 10:35:26 +0530 Subject: [PATCH] Pass db quota size config to embedded etcd used by restorer --- chart/templates/etcd-statefulset.yaml | 3 +++ chart/values.yaml | 2 ++ cmd/initializer.go | 15 ++++++++------- cmd/restore.go | 20 +++++++++++--------- cmd/server.go | 15 ++++++++------- cmd/types.go | 15 ++++++++------- pkg/snapshot/restorer/restorer.go | 4 ++++ pkg/snapshot/restorer/types.go | 15 ++++++++------- 8 files changed, 52 insertions(+), 37 deletions(-) diff --git a/chart/templates/etcd-statefulset.yaml b/chart/templates/etcd-statefulset.yaml index d7c8f40f5..a4071867b 100644 --- a/chart/templates/etcd-statefulset.yaml +++ b/chart/templates/etcd-statefulset.yaml @@ -91,6 +91,9 @@ spec: - --data-dir=/var/etcd/data/new.etcd - --storage-provider={{ .Values.backup.storageProvider }} - --store-prefix=etcd-{{ .Values.role }} +{{- if .Values.backup.embeddedEtcdQuotaBytes }} + - --embeddedEtcdQuotaBytes={{ .Values.backup.embeddedEtcdQuotaBytes }} +{{- end }} {{- if .Values.tls }} - --cert=/var/etcd/ssl/client/tls.crt - --key=/var/etcd/ssl/client/tls.key diff --git a/chart/values.yaml b/chart/values.yaml index 7e66b1d39..264d0a9f5 100644 --- a/chart/values.yaml +++ b/chart/values.yaml @@ -29,6 +29,8 @@ backup: storageContainer: "" + embeddedEtcdQuotaBytes: 8589934592 + # env should include the right list of values for the # storageProvider you use, follow the comments below env: [] # Follow comments below diff --git a/cmd/initializer.go b/cmd/initializer.go index 1b61fadbf..f5f9e7404 100644 --- a/cmd/initializer.go +++ b/cmd/initializer.go @@ -49,13 +49,14 @@ func NewInitializeCommand(stopCh <-chan struct{}) *cobra.Command { } options := &restorer.RestoreOptions{ - RestoreDataDir: path.Clean(restoreDataDir), - Name: restoreName, - ClusterURLs: clusterUrlsMap, - PeerURLs: peerUrls, - ClusterToken: restoreClusterToken, - SkipHashCheck: skipHashCheck, - MaxFetchers: restoreMaxFetchers, + RestoreDataDir: path.Clean(restoreDataDir), + Name: restoreName, + ClusterURLs: clusterUrlsMap, + PeerURLs: peerUrls, + ClusterToken: restoreClusterToken, + SkipHashCheck: skipHashCheck, + MaxFetchers: restoreMaxFetchers, + EmbeddedEtcdQuotaBytes: embeddedEtcdQuotaBytes, } var snapstoreConfig *snapstore.Config diff --git a/cmd/restore.go b/cmd/restore.go index 0f086ec5f..ef40f21b7 100644 --- a/cmd/restore.go +++ b/cmd/restore.go @@ -73,15 +73,16 @@ func NewRestoreCommand(stopCh <-chan struct{}) *cobra.Command { rs := restorer.NewRestorer(store, logger) options := &restorer.RestoreOptions{ - RestoreDataDir: path.Clean(restoreDataDir), - Name: restoreName, - BaseSnapshot: *baseSnap, - DeltaSnapList: deltaSnapList, - ClusterURLs: clusterUrlsMap, - PeerURLs: peerUrls, - ClusterToken: restoreClusterToken, - SkipHashCheck: skipHashCheck, - MaxFetchers: restoreMaxFetchers, + RestoreDataDir: path.Clean(restoreDataDir), + Name: restoreName, + BaseSnapshot: *baseSnap, + DeltaSnapList: deltaSnapList, + ClusterURLs: clusterUrlsMap, + PeerURLs: peerUrls, + ClusterToken: restoreClusterToken, + SkipHashCheck: skipHashCheck, + MaxFetchers: restoreMaxFetchers, + EmbeddedEtcdQuotaBytes: embeddedEtcdQuotaBytes, } err = rs.Restore(*options) @@ -107,6 +108,7 @@ func initializeEtcdFlags(cmd *cobra.Command) { cmd.Flags().StringVar(&restoreName, "name", defaultName, "human-readable name for this member") cmd.Flags().BoolVar(&skipHashCheck, "skip-hash-check", false, "ignore snapshot integrity hash value (required if copied from data directory)") cmd.Flags().IntVar(&restoreMaxFetchers, "max-fetchers", 6, "maximum number of threads that will fetch delta snapshots in parallel") + cmd.Flags().Int64Var(&embeddedEtcdQuotaBytes, "embedded-etcd-quota-bytes", int64(8*1024*1024*1024), "maximum backend quota for the embedded etcd used for applying delta snapshots") } func initialClusterFromName(name string) string { diff --git a/cmd/server.go b/cmd/server.go index 228d2c8c1..563b1b87f 100644 --- a/cmd/server.go +++ b/cmd/server.go @@ -57,13 +57,14 @@ func NewServerCommand(stopCh <-chan struct{}) *cobra.Command { } options := &restorer.RestoreOptions{ - RestoreDataDir: path.Clean(restoreDataDir), - Name: restoreName, - ClusterURLs: clusterUrlsMap, - PeerURLs: peerUrls, - ClusterToken: restoreClusterToken, - SkipHashCheck: skipHashCheck, - MaxFetchers: restoreMaxFetchers, + RestoreDataDir: path.Clean(restoreDataDir), + Name: restoreName, + ClusterURLs: clusterUrlsMap, + PeerURLs: peerUrls, + ClusterToken: restoreClusterToken, + SkipHashCheck: skipHashCheck, + MaxFetchers: restoreMaxFetchers, + EmbeddedEtcdQuotaBytes: embeddedEtcdQuotaBytes, } if storageProvider != "" { diff --git a/cmd/types.go b/cmd/types.go index e35520d04..459f3e051 100644 --- a/cmd/types.go +++ b/cmd/types.go @@ -49,13 +49,14 @@ var ( enableProfiling bool //restore flags - restoreCluster string - restoreClusterToken string - restoreDataDir string - restorePeerURLs []string - restoreName string - skipHashCheck bool - restoreMaxFetchers int + restoreCluster string + restoreClusterToken string + restoreDataDir string + restorePeerURLs []string + restoreName string + skipHashCheck bool + restoreMaxFetchers int + embeddedEtcdQuotaBytes int64 //snapstore flags storageProvider string diff --git a/pkg/snapshot/restorer/restorer.go b/pkg/snapshot/restorer/restorer.go index d03571215..27e649d72 100644 --- a/pkg/snapshot/restorer/restorer.go +++ b/pkg/snapshot/restorer/restorer.go @@ -63,6 +63,9 @@ func (r *Restorer) Restore(ro RestoreOptions) error { if ro.MaxFetchers < 1 { return fmt.Errorf("Maximum number of fetchers should be greater than zero. Input MaxFetchers: %d", ro.MaxFetchers) } + if ro.EmbeddedEtcdQuotaBytes <= 0 { + return fmt.Errorf("Quota size for etcd must be greater than 0. Input EmbeddedEtcdQuotaBytes: %d", ro.EmbeddedEtcdQuotaBytes) + } if err := r.restoreFromBaseSnapshot(ro); err != nil { return fmt.Errorf("failed to restore from the base snapshot :%v", err) } @@ -308,6 +311,7 @@ func makeWALAndSnap(waldir, snapdir string, cl *membership.RaftCluster, restoreN func startEmbeddedEtcd(ro RestoreOptions) (*embed.Etcd, error) { cfg := embed.NewConfig() cfg.Dir = filepath.Join(ro.RestoreDataDir) + cfg.QuotaBackendBytes = ro.EmbeddedEtcdQuotaBytes e, err := embed.StartEtcd(cfg) if err != nil { return nil, err diff --git a/pkg/snapshot/restorer/types.go b/pkg/snapshot/restorer/types.go index 0fe63fef2..b4e2fe8b1 100755 --- a/pkg/snapshot/restorer/types.go +++ b/pkg/snapshot/restorer/types.go @@ -36,13 +36,14 @@ type Restorer struct { // RestoreOptions hold all snapshot restore related fields type RestoreOptions struct { - ClusterURLs types.URLsMap - ClusterToken string - RestoreDataDir string - PeerURLs types.URLs - SkipHashCheck bool - Name string - MaxFetchers int + ClusterURLs types.URLsMap + ClusterToken string + RestoreDataDir string + PeerURLs types.URLs + SkipHashCheck bool + Name string + MaxFetchers int + EmbeddedEtcdQuotaBytes int64 // Base full snapshot + delta snapshots to restore from BaseSnapshot snapstore.Snapshot DeltaSnapList snapstore.SnapList