Handle SyncStateInvalid error when ImmutableIDs are enabled after initial backup (#3176)
Handles the `SyncStateInvalid` error if a delta URL constructed without the immutable ID header is used. This will fallback to full backup similar to how we handle other sync errors for delta queries. Also adds a hidden flag so we can test this using the CLI. *Note*: Enabling immutable IDs for exchange is not yet supported --- #### Does this PR need a docs update or release note? - [ ] ✅ Yes, it's included - [ ] 🕐 Yes, but in a later PR - [x] ⛔ No #### Type of change <!--- Please check the type of change your PR introduces: ---> - [ ] 🌻 Feature - [x] 🐛 Bugfix - [ ] 🗺️ Documentation - [ ] 🤖 Supportability/Tests - [ ] 💻 CI/Deployment - [ ] 🧹 Tech Debt/Cleanup #### Issue(s) <!-- Can reference multiple issues. Use one of the following "magic words" - "closes, fixes" to auto-close the Github issue. --> * #<issue> #### Test Plan <!-- How will this be tested prior to merging.--> - [ ] 💪 Manual - [x] ⚡ Unit test - [ ] 💚 E2E
This commit is contained in:
parent
306db14339
commit
2050a953fe
@ -88,6 +88,7 @@ func addExchangeCommands(cmd *cobra.Command) *cobra.Command {
|
|||||||
options.AddFetchParallelismFlag(c)
|
options.AddFetchParallelismFlag(c)
|
||||||
options.AddFailFastFlag(c)
|
options.AddFailFastFlag(c)
|
||||||
options.AddDisableIncrementalsFlag(c)
|
options.AddDisableIncrementalsFlag(c)
|
||||||
|
options.AddEnableImmutableIDFlag(c)
|
||||||
|
|
||||||
case listCommand:
|
case listCommand:
|
||||||
c, fs = utils.AddCommand(cmd, exchangeListCmd())
|
c, fs = utils.AddCommand(cmd, exchangeListCmd())
|
||||||
|
|||||||
@ -18,6 +18,7 @@ func Control() control.Options {
|
|||||||
opt.RestorePermissions = restorePermissionsFV
|
opt.RestorePermissions = restorePermissionsFV
|
||||||
opt.SkipReduce = skipReduceFV
|
opt.SkipReduce = skipReduceFV
|
||||||
opt.ToggleFeatures.DisableIncrementals = disableIncrementalsFV
|
opt.ToggleFeatures.DisableIncrementals = disableIncrementalsFV
|
||||||
|
opt.ToggleFeatures.ExchangeImmutableIDs = enableImmutableID
|
||||||
opt.ItemFetchParallelism = fetchParallelismFV
|
opt.ItemFetchParallelism = fetchParallelismFV
|
||||||
|
|
||||||
return opt
|
return opt
|
||||||
@ -34,6 +35,7 @@ const (
|
|||||||
RestorePermissionsFN = "restore-permissions"
|
RestorePermissionsFN = "restore-permissions"
|
||||||
SkipReduceFN = "skip-reduce"
|
SkipReduceFN = "skip-reduce"
|
||||||
DisableIncrementalsFN = "disable-incrementals"
|
DisableIncrementalsFN = "disable-incrementals"
|
||||||
|
EnableImmutableIDFN = "enable-immutable-id"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -101,3 +103,17 @@ func AddDisableIncrementalsFlag(cmd *cobra.Command) {
|
|||||||
"Disable incremental data retrieval in backups.")
|
"Disable incremental data retrieval in backups.")
|
||||||
cobra.CheckErr(fs.MarkHidden(DisableIncrementalsFN))
|
cobra.CheckErr(fs.MarkHidden(DisableIncrementalsFN))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var enableImmutableID bool
|
||||||
|
|
||||||
|
// Adds the hidden '--enable-immutable-id' cli flag which, when set, enables
|
||||||
|
// immutable IDs for Exchange
|
||||||
|
func AddEnableImmutableIDFlag(cmd *cobra.Command) {
|
||||||
|
fs := cmd.Flags()
|
||||||
|
fs.BoolVar(
|
||||||
|
&enableImmutableID,
|
||||||
|
EnableImmutableIDFN,
|
||||||
|
false,
|
||||||
|
"Enable exchange immutable ID.")
|
||||||
|
cobra.CheckErr(fs.MarkHidden(EnableImmutableIDFN))
|
||||||
|
}
|
||||||
|
|||||||
@ -34,6 +34,7 @@ const (
|
|||||||
errCodeMalwareDetected = "malwareDetected"
|
errCodeMalwareDetected = "malwareDetected"
|
||||||
errCodeSyncFolderNotFound = "ErrorSyncFolderNotFound"
|
errCodeSyncFolderNotFound = "ErrorSyncFolderNotFound"
|
||||||
errCodeSyncStateNotFound = "SyncStateNotFound"
|
errCodeSyncStateNotFound = "SyncStateNotFound"
|
||||||
|
errCodeSyncStateInvalid = "SyncStateInvalid"
|
||||||
errCodeResourceNotFound = "ResourceNotFound"
|
errCodeResourceNotFound = "ResourceNotFound"
|
||||||
errCodeRequestResourceNotFound = "Request_ResourceNotFound"
|
errCodeRequestResourceNotFound = "Request_ResourceNotFound"
|
||||||
errCodeMailboxNotEnabledForRESTAPI = "MailboxNotEnabledForRESTAPI"
|
errCodeMailboxNotEnabledForRESTAPI = "MailboxNotEnabledForRESTAPI"
|
||||||
@ -93,7 +94,7 @@ func IsErrDeletedInFlight(err error) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func IsErrInvalidDelta(err error) bool {
|
func IsErrInvalidDelta(err error) bool {
|
||||||
return hasErrorCode(err, errCodeSyncStateNotFound, errCodeResyncRequired) ||
|
return hasErrorCode(err, errCodeSyncStateNotFound, errCodeResyncRequired, errCodeSyncStateInvalid) ||
|
||||||
errors.Is(err, ErrInvalidDelta)
|
errors.Is(err, ErrInvalidDelta)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -137,6 +137,11 @@ func (suite *GraphErrorsUnitSuite) TestIsErrInvalidDelta() {
|
|||||||
err: odErr(errCodeResyncRequired),
|
err: odErr(errCodeResyncRequired),
|
||||||
expect: assert.True,
|
expect: assert.True,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "sync state invalid oDataErr",
|
||||||
|
err: odErr(errCodeSyncStateInvalid),
|
||||||
|
expect: assert.True,
|
||||||
|
},
|
||||||
// next two tests are to make sure the checks are case insensitive
|
// next two tests are to make sure the checks are case insensitive
|
||||||
{
|
{
|
||||||
name: "resync-required oDataErr camelcase",
|
name: "resync-required oDataErr camelcase",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user