diff --git a/Microsoft.Azure.Cosmos.Samples/Tools/FaultInjection/src/FaultInjection.csproj b/Microsoft.Azure.Cosmos.Samples/Tools/FaultInjection/src/FaultInjection.csproj index 9d40a016f8..dfd8f8693d 100644 --- a/Microsoft.Azure.Cosmos.Samples/Tools/FaultInjection/src/FaultInjection.csproj +++ b/Microsoft.Azure.Cosmos.Samples/Tools/FaultInjection/src/FaultInjection.csproj @@ -26,7 +26,6 @@ - diff --git a/Microsoft.Azure.Cosmos.Samples/Tools/FaultInjection/tests/FaultInjectionTests.csproj b/Microsoft.Azure.Cosmos.Samples/Tools/FaultInjection/tests/FaultInjectionTests.csproj index f52fc7cdfd..6489fc45e1 100644 --- a/Microsoft.Azure.Cosmos.Samples/Tools/FaultInjection/tests/FaultInjectionTests.csproj +++ b/Microsoft.Azure.Cosmos.Samples/Tools/FaultInjection/tests/FaultInjectionTests.csproj @@ -17,7 +17,6 @@ - diff --git a/Microsoft.Azure.Cosmos/src/RMResources.Designer.cs b/Microsoft.Azure.Cosmos/src/RMResources.Designer.cs index 5629d0cc8a..ba6cbc77d9 100644 --- a/Microsoft.Azure.Cosmos/src/RMResources.Designer.cs +++ b/Microsoft.Azure.Cosmos/src/RMResources.Designer.cs @@ -46,7 +46,7 @@ internal RMResources() if (object.ReferenceEquals(resourceMan, null)) { #if COSMOSCLIENT - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Microsoft.Azure.Documents.RMResources", typeof(RMResources).Assembly); + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Microsoft.Azure.Cosmos.RMResources", typeof(RMResources).Assembly); #else global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Microsoft.Azure.Documents.RMResources", typeof(RMResources).GetAssembly()); #endif diff --git a/Microsoft.Azure.Cosmos/src/direct/QuorumReader.cs b/Microsoft.Azure.Cosmos/src/direct/QuorumReader.cs index 2a96228e29..e5e3aa3772 100644 --- a/Microsoft.Azure.Cosmos/src/direct/QuorumReader.cs +++ b/Microsoft.Azure.Cosmos/src/direct/QuorumReader.cs @@ -795,7 +795,14 @@ private bool IsQuorumMet( selectedResponse = validReadResponses.Where(s => (s.Target.LSN == maxLsn) && (s.Target.StatusCode < StatusCodes.StartingErrorCode)).FirstOrDefault(); if (selectedResponse == null) { - selectedResponse = validReadResponses.First(s => s.Target.LSN == maxLsn); + try + { + selectedResponse = validReadResponses.First(s => s.Target.LSN == maxLsn); + } + catch + { + selectedResponse = validReadResponses.First(); + } } readLsn = selectedResponse.Target.ItemLSN == -1 ? diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/CosmosItemTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/CosmosItemTests.cs index 1463321ee7..9d99949168 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/CosmosItemTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/CosmosItemTests.cs @@ -33,6 +33,7 @@ namespace Microsoft.Azure.Cosmos.SDK.EmulatorTests using System.Reflection; using System.Text.RegularExpressions; using Microsoft.Azure.Cosmos.Diagnostics; + using Microsoft.Azure.Cosmos.FaultInjection; [TestClass] public class CosmosItemTests : BaseCosmosClientHelper @@ -3320,6 +3321,79 @@ await CosmosItemTests.GivenItemAsyncWhenMissingMemberHandlingIsErrorThenExpectsC cancellationToken: cancellationToken)); } + [TestMethod] + public async Task TooManyReadTest() + { + string connectionString = ConfigurationManager.GetEnvironmentVariable("COSMOSDB_MULTI_REGION", null); + + if (string.IsNullOrEmpty(connectionString)) + { + Assert.Fail("Set environment variable COSMOSDB_MULTI_REGION to run the tests"); + } + + FaultInjectionCondition readConditon = new FaultInjectionConditionBuilder() + .WithOperationType(FaultInjectionOperationType.ReadItem) + .Build(); + IFaultInjectionResult tooManyRequestsResult = FaultInjectionResultBuilder + .GetResultBuilder(FaultInjectionServerErrorType.TooManyRequests) + .Build(); + FaultInjectionRule rule = new FaultInjectionRuleBuilder( + id: "tooMany", + condition: readConditon, + result: tooManyRequestsResult) + .WithDuration(TimeSpan.FromMinutes(90)) + .Build(); + + List rules = new List() { rule }; + FaultInjector faultInjector = new FaultInjector(rules); + + rule.Disable(); + + + CosmosClientOptions clientOptions = new CosmosClientOptions() + { + ConnectionMode = ConnectionMode.Direct, + ConsistencyLevel = Cosmos.ConsistencyLevel.Strong, + }; + + CosmosClient faultInjectionClient = new CosmosClient( + connectionString: connectionString, + clientOptions: faultInjector.GetFaultInjectionClientOptions(clientOptions)); + + Cosmos.Database db = await faultInjectionClient.CreateDatabaseIfNotExistsAsync("LoadTest"); + Container container = await db.CreateContainerIfNotExistsAsync("LoadContainer", "/pk"); + + dynamic item = new + { + id = "testId", + pk = "pk", + }; + + await container.CreateItemAsync(item); + + rule.Enable(); + + try + { + ItemResponse ir = await container.ReadItemAsync( + "testId", + new Cosmos.PartitionKey("pk"), + new ItemRequestOptions() + { + ExcludeRegions = new List() { "West US" } + }); + + + Assert.AreEqual(HttpStatusCode.OK, ir.StatusCode); + } + finally + { + await db.DeleteAsync(); + faultInjectionClient.Dispose(); + } + + } + private static async Task GivenItemStreamAsyncWhenMissingMemberHandlingIsErrorThenExpectsCosmosExceptionTestAsync( Func> itemStreamAsync) { diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Microsoft.Azure.Cosmos.EmulatorTests.csproj b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Microsoft.Azure.Cosmos.EmulatorTests.csproj index 928e057967..b99af2f55c 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Microsoft.Azure.Cosmos.EmulatorTests.csproj +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Microsoft.Azure.Cosmos.EmulatorTests.csproj @@ -19,7 +19,6 @@ - @@ -361,6 +360,9 @@ PreserveNewest + + + true