ensure invalid deltas result in new state collections (#4623)

#### Does this PR need a docs update or release note?

- [x]  No

#### Type of change

- [x] 🐛 Bugfix

#### Test Plan

- [x]  Unit test
- [x] 💚 E2E
This commit is contained in:
Keepers 2023-11-10 14:45:27 -07:00 committed by GitHub
parent e9118abe9f
commit 80feeace3b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 120 additions and 3 deletions

View File

@ -335,7 +335,7 @@ func (c *Collections) Get(
logger.Ctx(ictx).Infow(
"previous metadata for drive",
"num_paths_entries", len(oldPrevPaths))
"count_old_prev_paths", len(oldPrevPaths))
du, newPrevPaths, err := c.PopulateDriveCollections(
ctx,
@ -368,7 +368,7 @@ func (c *Collections) Get(
logger.Ctx(ictx).Infow(
"persisted metadata for drive",
"num_new_paths_entries", len(newPrevPaths),
"count_new_prev_paths", len(newPrevPaths),
"delta_reset", du.Reset)
numDriveItems := c.NumItems - numPrevItems
@ -762,6 +762,7 @@ func (c *Collections) PopulateDriveCollections(
ctx = clues.Add(ctx, "delta_reset_occurred", true)
newPrevPaths = map[string]string{}
currPrevPaths = map[string]string{}
seenFolders = map[string]string{}
c.CollectionMap[driveID] = map[string]*Collection{}
invalidPrevDelta = true
}
@ -929,6 +930,10 @@ func (c *Collections) processItem(
delete(newPrevPaths, alreadyHandledFolderID)
}
if invalidPrevDelta {
prevPath = nil
}
seenFolders[collectionPath.String()] = itemID
col, err := NewCollection(

View File

@ -2403,6 +2403,118 @@ func (suite *CollectionsUnitSuite) TestGet() {
fullPath(1, name(folder)): true,
},
},
{
name: "OneDrive_OneItemPage_InvalidPrevDelta_AnotherFolderAtExistingLocation",
drives: []models.Driveable{drive1},
enumerator: mock.EnumerateItemsDeltaByDrive{
DrivePagers: map[string]*mock.DriveItemsDeltaPager{
idx(drive, 1): {
Pages: []mock.NextPage{
{
Items: []models.DriveItemable{
driveRootItem(rootID),
driveItem(id(folder), name(folder), parent(1), rootID, isFolder),
driveItem(id(file), name(file), parent(1, name(folder)), id(folder), isFile),
},
},
{
Items: []models.DriveItemable{},
Reset: true,
},
{
Items: []models.DriveItemable{
driveRootItem(rootID),
driveItem(id(folder), name(folder), parent(1), rootID, isFolder),
driveItem(id(file), name(file), parent(1, name(folder)), id(folder), isFile),
},
},
},
DeltaUpdate: pagers.DeltaUpdate{URL: delta, Reset: true},
},
},
},
canUsePreviousBackup: true,
errCheck: assert.NoError,
previousPaths: map[string]map[string]string{
idx(drive, 1): {
rootID: fullPath(1),
id(folder): fullPath(1, name(folder)),
},
},
expectedCollections: map[string]map[data.CollectionState][]string{
fullPath(1): {data.NewState: {}},
fullPath(1, name(folder)): {
data.NewState: {id(folder), id(file)},
},
},
expectedDeltaURLs: map[string]string{
idx(drive, 1): delta,
},
expectedPreviousPaths: map[string]map[string]string{
idx(drive, 1): {
rootID: fullPath(1),
id(folder): fullPath(1, name(folder)),
},
},
expectedDelList: pmMock.NewPrefixMap(map[string]map[string]struct{}{}),
doNotMergeItems: map[string]bool{
fullPath(1): true,
fullPath(1, name(folder)): true,
},
},
{
name: "OneDrive_OneItemPage_ImmediateInvalidPrevDelta_MoveFolderToPreviouslyExistingPath",
drives: []models.Driveable{drive1},
enumerator: mock.EnumerateItemsDeltaByDrive{
DrivePagers: map[string]*mock.DriveItemsDeltaPager{
idx(drive, 1): {
Pages: []mock.NextPage{
{
Items: []models.DriveItemable{},
Reset: true,
},
{
Items: []models.DriveItemable{
driveRootItem(rootID),
driveItem(idx(folder, 2), name(folder), parent(1), rootID, isFolder),
driveItem(idx(file, 2), name(file), parent(1, name(folder)), idx(folder, 2), isFile),
},
},
},
DeltaUpdate: pagers.DeltaUpdate{URL: delta, Reset: true},
},
},
},
canUsePreviousBackup: true,
errCheck: assert.NoError,
previousPaths: map[string]map[string]string{
idx(drive, 1): {
rootID: fullPath(1),
id(folder): fullPath(1, name(folder)),
},
},
expectedCollections: map[string]map[data.CollectionState][]string{
fullPath(1): {data.NewState: {}},
fullPath(1, name(folder)): {
data.DeletedState: {},
data.NewState: {idx(folder, 2), idx(file, 2)},
},
},
expectedDeltaURLs: map[string]string{
idx(drive, 1): delta,
},
expectedPreviousPaths: map[string]map[string]string{
idx(drive, 1): {
rootID: fullPath(1),
idx(folder, 2): fullPath(1, name(folder)),
},
},
expectedDelList: pmMock.NewPrefixMap(map[string]map[string]struct{}{}),
doNotMergeItems: map[string]bool{
fullPath(1): true,
fullPath(1, name(folder)): true,
},
},
{
name: "OneDrive_OneItemPage_InvalidPrevDelta_AnotherFolderAtDeletedLocation",
drives: []models.Driveable{drive1},
@ -2555,7 +2667,7 @@ func (suite *CollectionsUnitSuite) TestGet() {
},
expectedCollections: map[string]map[data.CollectionState][]string{
fullPath(1): {data.NewState: {}},
fullPath(1, name(folder)): {data.NotMovedState: {id(folder), id(file)}},
fullPath(1, name(folder)): {data.NewState: {id(folder), id(file)}},
fullPath(1, namex(folder, 2)): {data.DeletedState: {}},
},
expectedDeltaURLs: map[string]string{