diff --git a/src/cli/backup/exchange.go b/src/cli/backup/exchange.go index 683ca4357..974fa0166 100644 --- a/src/cli/backup/exchange.go +++ b/src/cli/backup/exchange.go @@ -85,6 +85,7 @@ func addExchangeCommands(cmd *cobra.Command) *cobra.Command { flags.AddDisableConcurrencyLimiterFlag(c) flags.AddDeltaPageSizeFlag(c) flags.AddGenericBackupFlags(c) + flags.AddDisableSlidingWindowLimiterFlag(c) case listCommand: c, fs = utils.AddCommand(cmd, exchangeListCmd()) diff --git a/src/cli/backup/exchange_test.go b/src/cli/backup/exchange_test.go index 194e6a8d2..b5738dba5 100644 --- a/src/cli/backup/exchange_test.go +++ b/src/cli/backup/exchange_test.go @@ -109,6 +109,7 @@ func (suite *ExchangeUnitSuite) TestBackupCreateFlags() { "--" + flags.DisableDeltaFN, "--" + flags.EnableImmutableIDFN, "--" + flags.DisableConcurrencyLimiterFN, + "--" + flags.DisableSlidingWindowLimiterFN, }, flagsTD.PreparedGenericBackupFlags(), flagsTD.PreparedProviderFlags(), @@ -126,6 +127,7 @@ func (suite *ExchangeUnitSuite) TestBackupCreateFlags() { assert.True(t, co.ToggleFeatures.DisableDelta) assert.True(t, co.ToggleFeatures.ExchangeImmutableIDs) assert.True(t, co.ToggleFeatures.DisableConcurrencyLimiter) + assert.True(t, co.ToggleFeatures.DisableSlidingWindowLimiter) flagsTD.AssertGenericBackupFlags(t, cmd) flagsTD.AssertProviderFlags(t, cmd) flagsTD.AssertStorageFlags(t, cmd) diff --git a/src/cli/flags/options.go b/src/cli/flags/options.go index 841e13169..a819938a1 100644 --- a/src/cli/flags/options.go +++ b/src/cli/flags/options.go @@ -5,22 +5,23 @@ import ( ) const ( - AlertsFN = "alerts" - DeltaPageSizeFN = "delta-page-size" - DisableConcurrencyLimiterFN = "disable-concurrency-limiter" - DisableDeltaFN = "disable-delta" - DisableIncrementalsFN = "disable-incrementals" - ForceItemDataDownloadFN = "force-item-data-download" - EnableImmutableIDFN = "enable-immutable-id" - FailFastFN = "fail-fast" - FailedItemsFN = "failed-items" - FetchParallelismFN = "fetch-parallelism" - NoStatsFN = "no-stats" - RecoveredErrorsFN = "recovered-errors" - NoPermissionsFN = "no-permissions" - RunModeFN = "run-mode" - SkippedItemsFN = "skipped-items" - SkipReduceFN = "skip-reduce" + AlertsFN = "alerts" + DeltaPageSizeFN = "delta-page-size" + DisableConcurrencyLimiterFN = "disable-concurrency-limiter" + DisableDeltaFN = "disable-delta" + DisableIncrementalsFN = "disable-incrementals" + ForceItemDataDownloadFN = "force-item-data-download" + EnableImmutableIDFN = "enable-immutable-id" + FailFastFN = "fail-fast" + FailedItemsFN = "failed-items" + FetchParallelismFN = "fetch-parallelism" + NoStatsFN = "no-stats" + RecoveredErrorsFN = "recovered-errors" + NoPermissionsFN = "no-permissions" + RunModeFN = "run-mode" + SkippedItemsFN = "skipped-items" + SkipReduceFN = "skip-reduce" + DisableSlidingWindowLimiterFN = "disable-sliding-limiter" ) var ( @@ -39,9 +40,10 @@ var ( NoStatsFV bool // RunMode describes the type of run, such as: // flagtest, dry, run. Should default to 'run'. - RunModeFV string - NoPermissionsFV bool - SkipReduceFV bool + RunModeFV string + NoPermissionsFV bool + SkipReduceFV bool + DisableSlidingWindowLimiterFV bool ) // well-known flag values @@ -174,3 +176,18 @@ func AddRunModeFlag(cmd *cobra.Command, persistent bool) { fs.StringVar(&RunModeFV, RunModeFN, "run", "What mode to run: dry, test, run. Defaults to run.") cobra.CheckErr(fs.MarkHidden(RunModeFN)) } + +// AddDisableSlidingWindowLimiterFN disables the experimental sliding window rate +// limiter for graph API requests. This is only relevant for exchange backups. +// Exchange restores continue to use the default token bucket rate limiter. +// Setting this flag switches exchange backups to use the default token bucket +// rate limiter. +func AddDisableSlidingWindowLimiterFlag(cmd *cobra.Command) { + fs := cmd.Flags() + fs.BoolVar( + &DisableSlidingWindowLimiterFV, + DisableSlidingWindowLimiterFN, + false, + "Disable sliding window rate limiter. Default: false") + cobra.CheckErr(fs.MarkHidden(DisableSlidingWindowLimiterFN)) +} diff --git a/src/cli/utils/options.go b/src/cli/utils/options.go index fdb92aced..4dfdabced 100644 --- a/src/cli/utils/options.go +++ b/src/cli/utils/options.go @@ -27,6 +27,7 @@ func Control() control.Options { opt.ToggleFeatures.DisableDelta = flags.DisableDeltaFV opt.ToggleFeatures.ExchangeImmutableIDs = flags.EnableImmutableIDFV opt.ToggleFeatures.DisableConcurrencyLimiter = flags.DisableConcurrencyLimiterFV + opt.ToggleFeatures.DisableSlidingWindowLimiter = flags.DisableSlidingWindowLimiterFV opt.Parallelism.ItemFetch = flags.FetchParallelismFV return opt diff --git a/src/cli/utils/options_test.go b/src/cli/utils/options_test.go index 919f33b3a..5b46a3ec3 100644 --- a/src/cli/utils/options_test.go +++ b/src/cli/utils/options_test.go @@ -37,6 +37,7 @@ func (suite *OptionsUnitSuite) TestAddExchangeCommands() { assert.Equal(t, 2, flags.FetchParallelismFV, flags.FetchParallelismFN) assert.True(t, flags.DisableConcurrencyLimiterFV, flags.DisableConcurrencyLimiterFN) assert.Equal(t, 499, flags.DeltaPageSizeFV, flags.DeltaPageSizeFN) + assert.True(t, flags.DisableSlidingWindowLimiterFV, flags.DisableSlidingWindowLimiterFN) }, } @@ -52,6 +53,7 @@ func (suite *OptionsUnitSuite) TestAddExchangeCommands() { flags.AddFetchParallelismFlag(cmd) flags.AddDisableConcurrencyLimiterFlag(cmd) flags.AddDeltaPageSizeFlag(cmd) + flags.AddDisableSlidingWindowLimiterFlag(cmd) // Test arg parsing for few args cmd.SetArgs([]string{ @@ -66,6 +68,7 @@ func (suite *OptionsUnitSuite) TestAddExchangeCommands() { "--" + flags.FetchParallelismFN, "2", "--" + flags.DisableConcurrencyLimiterFN, "--" + flags.DeltaPageSizeFN, "499", + "--" + flags.DisableSlidingWindowLimiterFN, }) err := cmd.Execute() diff --git a/src/pkg/control/options.go b/src/pkg/control/options.go index 7db2d9038..b804d63e9 100644 --- a/src/pkg/control/options.go +++ b/src/pkg/control/options.go @@ -91,4 +91,11 @@ type Toggles struct { // the protected resource. PreviewBackups are used to demonstrate value by // being quick to create. PreviewBackup bool `json:"previewBackup"` + + // DisableSlidingWindowLimiter disables the experimental sliding window rate + // limiter for graph API requests. This is only relevant for exchange backups. + // Exchange restores continue to use the default token bucket rate limiter. + // Setting this flag switches exchange backups to use the default token bucket + // rate limiter. + DisableSlidingWindowLimiter bool `json:"disableSlidingWindowLimiter"` }