private async Task <SampleCustomer> InsertItemAsync(Container container, string region, SampleCustomer item) { //DeepCopy the item item = ConflictGenerator.Clone(item); //Update the region item.Region = region; //Update UserDefinedId to random number for Conflict Resolution item.UserDefinedId = ConflictGenerator.RandomNext(0, 1000); Console.WriteLine($"Attempting insert - Name: {item.Name}, City: {item.City}, UserDefId: {item.UserDefinedId}, Region: {item.Region}"); try { ItemResponse <SampleCustomer> response = await container.CreateItemAsync <SampleCustomer>(item, new PartitionKey(item.MyPartitionKey)); if (response.StatusCode == System.Net.HttpStatusCode.Conflict) { return(null); //item has already replicated so not possible to generate conflict } else { return(response.Resource); } } catch (CosmosException e) { //Conflict error if (e.StatusCode == HttpStatusCode.Conflict) { return(null); } else { throw e; } } }
public async Task GenerateUpdateConflicts(ConflictGenerator conflict) { try { //Verify the containers are created and referenced await InitializeConflicts(conflict); bool isConflicts = false; Console.WriteLine($"\n{conflict.testName}\nPress any key to continue..."); Console.ReadKey(true); Console.WriteLine($"Insert an item to create an update conflict on.\n"); //Get reference to West US 2 region to insert a customer ReplicaRegion insertRegion = conflict.replicaRegions.Find(s => s.region == "West US 2"); //Container to insert customer Container insertContainer = insertRegion.container; //Generate a new customer SampleCustomer seedCustomer = SampleCustomer.GenerateCustomers(conflict.partitionKeyValue, 1)[0]; //Insert Customer seedCustomer = await InsertItemAsync(insertContainer, insertRegion.region, seedCustomer); //Wait for item to replicate globally Console.WriteLine($"\nAllow item to replicate.\n"); //await Task.Delay(5000); await VerifyItemReplicated(conflict, seedCustomer); //Task list for async updates IList <Task <SampleCustomer> > tasks = new List <Task <SampleCustomer> >(); //Read back the replicated customer and get the ETag ItemResponse <SampleCustomer> customerResponse = await insertContainer.ReadItemAsync <SampleCustomer>(seedCustomer.Id, new PartitionKey(seedCustomer.MyPartitionKey)); Console.WriteLine($"Attempting simultaneous update in {replicaRegions.Count} regions\n"); while (!isConflicts) { foreach (ReplicaRegion updateRegion in conflict.replicaRegions) { //DeepCopy the item SampleCustomer updateCustomer = ConflictGenerator.Clone(seedCustomer); //Update region to where update is made and provide new UserDefinedId value updateCustomer.Region = updateRegion.region; updateCustomer.UserDefinedId = ConflictGenerator.RandomNext(0, 1000); //Add update to Task List tasks.Add(UpdateItemAsync(updateRegion.container, updateCustomer)); } SampleCustomer[] updateCustomers = await Task.WhenAll(tasks); isConflicts = IsConflict(updateCustomers); } } catch (Exception e) { Console.WriteLine(e.Message + "\nPress any key to continue"); Console.ReadKey(); } }