vsts-sync-migratorazure-devops-migration-tools

How to prevent Save Exception in Work Items?


Version 8.9.2 - when I run an Azure DevOps to Azure DevOps migration using base Scrum process (modified with inherited process that adds ReflectedWorkItemId to WITs), I observe save exceptions for a small percentage of the work-items during migration. After migration, I find empty work-items created with no title. Example:

(SessionID: 5c74594c-ad96-4d2c-a056-8aec8e35e9f8)

[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | 
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | Work Item has 10 revisions and revision migration is set to True
===============================================================================================
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | Found 10 revisions to migrate on  Work item:120
===============================================================================================
[                Task][Complete: 1/10][sid:120   |Rev:1  ][tid:null   |  Processing Revision [1]
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | ...FAILED to Save
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | Custom.ReflectedWorkItemId (ReflectedWorkItemId) | 
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | Microsoft.VSTS.Common.BacklogPriority (Backlog Priority) | 
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | Microsoft.VSTS.CMMI.Blocked (Blocked) | 
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | Microsoft.VSTS.Build.IntegrationBuild (Integration Build) | 
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | Microsoft.VSTS.Common.Priority (Priority) | 2
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | Microsoft.VSTS.Common.ClosedBy (Closed By) | 
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | Microsoft.VSTS.Common.ClosedDate (Closed Date) | 
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | Microsoft.VSTS.Common.ActivatedBy (Activated By) | 
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | Microsoft.VSTS.Common.ActivatedDate (Activated Date) | 
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | Microsoft.VSTS.Common.StateChangeDate (State Change Date) | 
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | Microsoft.VSTS.Common.Activity (Activity) | 
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | Microsoft.VSTS.Scheduling.RemainingWork (Remaining Work) | 
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.BoardLane (Board Lane) | 
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.BoardColumnDone (Board Column Done) | 
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.BoardColumn (Board Column) | 
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.Tags (Tags) | 
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.RelatedLinkCount (Related Link Count) | 0
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.History (History) | 
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.Description (Description) | 
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.CreatedBy (Created By) | Lori Y
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.CreatedDate (Created Date) | 1/9/2019 8:40:17 AM
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.WorkItemType (Work Item Type) | Task
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.AssignedTo (Assigned To) | 
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.Reason (Reason) | New task
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.ChangedBy (Changed By) | Taylor, Simon Z
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.Rev (Rev) | 
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.Watermark (Watermark) | 
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.AuthorizedDate (Authorized Date) | 
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.State (State) | To Do
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.Title (Title) | 
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.AuthorizedAs (Authorized As) | 
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.AreaId (Area ID) | 23
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.Id (ID) | 0
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.ChangedDate (Changed Date) | 
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.RevisedDate (Revised Date) | 
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.AreaPath (Area Path) | Oit migration test
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.NodeName (Node Name) | Oit migration test
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.AttachedFileCount (Attached File Count) | 0
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.HyperLinkCount (Hyperlink Count) | 0
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.CommentCount (Comment Count) | 
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.RemoteLinkCount (Remote Link Count) | 
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.Parent (Parent) | 
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.TeamProject (Team Project) | Oit migration test
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.ExternalLinkCount (External Link Count) | 0
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.IterationId (Iteration ID) | 23
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.IterationPath (Iteration Path) | Oit migration test
[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | System.AggregateException: One or more errors occurred. ---> Microsoft.VisualStudio.Services.WebApi.VssServiceResponseException: Page not found.
   at Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.<HandleResponseAsync>d__53.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.<SendAsync>d__51.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.<SendAsync>d__47`1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.<SendAsync>d__28`1.MoveNext()
   --- End of inner exception stack trace ---
   at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
   at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
   at System.Threading.Tasks.Task.Wait()
   at VstsSyncMigrator.Engine.WorkItemMigrationContext.ReplayRevisions(List`1 revisionsToMigrate, WorkItem sourceWorkItem, WorkItem targetWorkItem, Project destProject, WorkItemStoreContext sourceStore, Int32 current, WorkItemStoreContext targetStore) in D:\a\1\s\src\VstsSyncMigrator.Core\Execution\MigrationContext\WorkItemMigrationContext.cs:line 394
---> (Inner Exception #0) Microsoft.VisualStudio.Services.WebApi.VssServiceResponseException: Page not found.
   at Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.<HandleResponseAsync>d__53.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.<SendAsync>d__51.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.<SendAsync>d__47`1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.<SendAsync>d__28`1.MoveNext()<---

[Product Backlog Item][Complete: 1/10][sid:120   |Rev:10 ][tid:null   | Average time of 1:644 seconds per work item and 0 hours 0 minutes 16:440 seconds estimated to completion

I have reproduced this error using the following steps: 1. Setup modified/inherited Scrum process "Migration" with "ReflectedWorkItemId" added to appropriate WITs on two separate Azure DevOps organizations 2. Setup source and target Projects "Migration test 2" using the Migration process configured in (1) 3. Create and save Product Backlog Item WIT in source project with Title "Test Changing PBI to Task" 4. Change type of WIT just created to type Task. Resolve State field issue by changing from "New" to "To Do" and save 5. Setup configuration.json configuration based on default ("init") generated json w/ typical modifications per video (empty field maps, etc.). Enable iteration processor and WIT processor. Modify QueryBit for WIT processor to exclude only Test Suite and Test Plan WITs. Set ReplayRevisions to true. 6. Run migration (on the one WIT created and modified in (2) and (3)). Error reproduced:

(SessionID: 6984b357-03ec-401d-ba03-7d43c84c4c6e)

Found 'Custom.ReflectedWorkItemId' in this project, proceeding.
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | 
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | Work Item has 2 revisions and revision migration is set to True
===============================================================================================
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | Found 2 revisions to migrate on  Work item:150
===============================================================================================
[Product Backlog Item][Complete:1/1][sid:150   |Rev:1  ][tid:null   |  Processing Revision [1]
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | ...FAILED to Save
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | Custom.ReflectedWorkItemId (ReflectedWorkItemId) | 
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | Microsoft.VSTS.Common.BacklogPriority (Backlog Priority) | 
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | Microsoft.VSTS.Common.AcceptanceCriteria (Acceptance Criteria) | 
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | Microsoft.VSTS.Scheduling.Effort (Effort) | 
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | Microsoft.VSTS.Common.BusinessValue (Business Value) | 
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | Microsoft.VSTS.Build.IntegrationBuild (Integration Build) | 
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | Microsoft.VSTS.Common.ValueArea (Value Area) | Business
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | Microsoft.VSTS.Common.Priority (Priority) | 2
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | Microsoft.VSTS.Common.ClosedBy (Closed By) | 
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | Microsoft.VSTS.Common.ClosedDate (Closed Date) | 
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | Microsoft.VSTS.Common.ActivatedBy (Activated By) | 
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | Microsoft.VSTS.Common.ActivatedDate (Activated Date) | 
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | Microsoft.VSTS.Common.StateChangeDate (State Change Date) | 
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.BoardLane (Board Lane) | 
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.BoardColumnDone (Board Column Done) | 
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.BoardColumn (Board Column) | 
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.Tags (Tags) | 
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.RelatedLinkCount (Related Link Count) | 0
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.History (History) | 
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.Description (Description) | 
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.CreatedBy (Created By) | Taylor, Simon Z
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.CreatedDate (Created Date) | 5/11/2020 2:07:59 PM
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.WorkItemType (Work Item Type) | Product Backlog Item
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.AssignedTo (Assigned To) | 
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.Reason (Reason) | New backlog item
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.ChangedBy (Changed By) | Taylor, Simon Z
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.Rev (Rev) | 
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.Watermark (Watermark) | 
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.AuthorizedDate (Authorized Date) | 
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.State (State) | New
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.Title (Title) | 
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.AuthorizedAs (Authorized As) | 
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.AreaId (Area ID) | 40
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.Id (ID) | 0
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.ChangedDate (Changed Date) | 
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.RevisedDate (Revised Date) | 
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.AreaPath (Area Path) | Oit migration test 2
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.NodeName (Node Name) | Oit migration test 2
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.AttachedFileCount (Attached File Count) | 0
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.HyperLinkCount (Hyperlink Count) | 0
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.CommentCount (Comment Count) | 
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.RemoteLinkCount (Remote Link Count) | 
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.Parent (Parent) | 
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.TeamProject (Team Project) | Oit migration test 2
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.ExternalLinkCount (External Link Count) | 0
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.IterationId (Iteration ID) | 40
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.IterationPath (Iteration Path) | Oit migration test 2
[                Task][Complete:1/1][sid:150   |Rev:2  ][tid:null   | System.AggregateException: One or more errors occurred. ---> Microsoft.VisualStudio.Services.WebApi.VssServiceResponseException: Page not found.
   at Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.<HandleResponseAsync>d__53.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.<SendAsync>d__51.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.<SendAsync>d__47`1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

Migrated from: https://github.com/nkdAgility/azure-devops-migration-tools/issues/485


Solution

  • After reviewing the documentation, I found the SkipToFinalRevisedWorkItemType configuration element for the VstsSyncMigrator.Engine.Configuration.Processing.WorkItemMigrationConfig processor. The docs are a bit cryptic, but I tried setting this configuration element to true and found it eliminated the save exceptions, resulting in successful migration and no blank-titled work-items.

    I searched all issues and did not find mention of the SkipToFinalRevisedWorkItemType except in one closed issue that included a configuration.json listing.

    If the intended functionality of the SkipToFinalRevisedWorkItemType is to address this Save exception, I would suggest a documentation update to indicate that work-item types that were changed will fail to save when replaying revisions unless SkipToFinalRevisedWorkItemType is set to true. Ideally, a code update that resulted in more graceful/informative exception handling would be added, if not functionality that could successfully navigate work-item type changes when replaying revisions.

    If none of those options are possible at present, then this issue can be closed to serve as nominal documentation.