in Common/Migration/Migrator.cs [115:159]
private async Task MigratePhase3()
{
IEnumerable<IPhase3Processor> phase3Processors = ClientHelpers.GetProcessorInstances<IPhase3Processor>(context.Config);
if (phase3Processors != null && !phase3Processors.Any())
{
// nothing to do if no phase 3 processors are enabled
return;
}
// Phase1 or Phase2 have completed, and FailureReason == None
IEnumerable<WorkItemMigrationState> successfullyMigratedWorkItemMigrationStates = context.WorkItemsMigrationState.Where(w => (w.MigrationCompleted.HasFlag(WorkItemMigrationState.MigrationCompletionStatus.Phase1) || w.MigrationCompleted.HasFlag(WorkItemMigrationState.MigrationCompletionStatus.Phase2)) && w.FailureReason == FailureReason.None);
var phase3WorkItemsToUpdateCount = successfullyMigratedWorkItemMigrationStates.Count();
var totalNumberOfBatches = ClientHelpers.GetBatchCount(phase3WorkItemsToUpdateCount, Constants.BatchSize);
if (phase3WorkItemsToUpdateCount == 0)
{
return;
}
await successfullyMigratedWorkItemMigrationStates.Batch(Constants.BatchSize).ForEachAsync(context.Config.Parallelism, async (workItemMigrationStateBatch, batchId) =>
{
IBatchMigrationContext batchContext = new BatchMigrationContext(batchId, workItemMigrationStateBatch);
IList<(int SourceId, WitBatchRequest WitBatchRequest)> sourceIdToWitBatchRequests = new List<(int SourceId, WitBatchRequest WitBatchRequest)>();
IList<WorkItem> sourceWorkItemsInBatch = await WorkItemTrackingHelpers.GetWorkItemsAsync(context.SourceClient.WorkItemTrackingHttpClient, workItemMigrationStateBatch.Select(a => a.SourceId).ToList(), expand: WorkItemExpand.All);
foreach (WorkItem sourceWorkItem in sourceWorkItemsInBatch)
{
IList<JsonPatchOperation> jsonPatchOperations = new List<JsonPatchOperation>();
foreach (IPhase3Processor processor in phase3Processors)
{
IEnumerable<JsonPatchOperation> processorJsonPatchOperations = await processor.Process(context, null, sourceWorkItem, null);
jsonPatchOperations.AddRange(processorJsonPatchOperations);
}
if (jsonPatchOperations.Any())
{
WitBatchRequest witBatchRequest = GenerateWitBatchRequestFromJsonPatchOperations(jsonPatchOperations, sourceWorkItem.Id.Value);
sourceIdToWitBatchRequests.Add((sourceWorkItem.Id.Value, witBatchRequest));
}
}
var phase3ApiWrapper = new Phase3ApiWrapper();
await phase3ApiWrapper.ExecuteWitBatchRequests(sourceIdToWitBatchRequests, context, batchContext);
});
}