protected FabricRequest(IFabricClient fabricClient, TimeSpan timeout) { ThrowIf.Null(fabricClient, "fabricClient"); this.FabricClient = fabricClient; this.Timeout = timeout; this.SucceedErrorCodes = new List <uint>(); this.SucceedErrorCodes.Add((uint)NativeTypes.FABRIC_ERROR_CODE.S_OK); this.RetryErrorCodes = new List <uint>(); this.RetryErrorCodes.Add((uint)NativeTypes.FABRIC_ERROR_CODE.FABRIC_E_TIMEOUT); this.RetryErrorCodes.Add((uint)NativeTypes.FABRIC_ERROR_CODE.E_ABORT); this.RetryErrorCodes.Add((uint)NativeTypes.FABRIC_ERROR_CODE.FABRIC_E_GATEWAY_NOT_REACHABLE); this.ProcessResult = FabricRequestProcessor.SuccessRetryErrorCodeProcessor(this); }
private static Predicate <IRetryContext> ResultCountConstraint <TList, TItem>(FabricRequest request, int expectedResultCount, Func <int, int, bool> condition) where TList : IList <TItem> { ThrowIf.OutOfRange(expectedResultCount, 0, int.MaxValue, "expectedResultCount"); return(delegate(IRetryContext r) { Predicate <IRetryContext> errorCodeChecker = FabricRequestProcessor.SuccessRetryErrorCodeProcessor(request); // Only check the instance count if the request was a success AND the error code is S_OK. Some resolve requests // are used to check if the service has been deleted properly and will not have an S_OK success associated with them... if (errorCodeChecker(r) && request.OperationResult.ErrorCode == 0) { OperationResult <TList> actualResult = (OperationResult <TList>)request.OperationResult; int actualResultLength = actualResult.Result.Count(); if (condition(actualResultLength, expectedResultCount)) { r.ShouldRetry = false; r.Succeeded = true; TestabilityTrace.TraceSource.WriteNoise("FabricRequestProcessor", "{0}: Request succeeded with expected result count: '{1}'", r.ActivityId, actualResultLength); } else { ResolveServiceRequest tempRequest = request as ResolveServiceRequest; if (tempRequest != null && typeof(TItem) == typeof(TestServicePartitionInfo)) { tempRequest.PreviousResult = actualResult.Result.First() as TestServicePartitionInfo; } r.ShouldRetry = true; r.Succeeded = false; TestabilityTrace.TraceSource.WriteInfo( "FabricRequestProcessor", "{0}: Request failed in result count validation. Expected result count: '{1}'. Actual result count : '{2}'", r.ActivityId, expectedResultCount, actualResultLength); } } return r.Succeeded; }); }
public static Predicate <IRetryContext> ExpectedResultCount <TList, TItem>(FabricRequest request, int expectedResultCount) where TList : IList <TItem> { return(FabricRequestProcessor.ResultCountConstraint <TList, TItem>(request, expectedResultCount, (a, b) => a == b)); }
public static Predicate <IRetryContext> ExpectedPartitionCount(FabricRequest request, int expectedResultCount) { return(FabricRequestProcessor.ResultCountConstraint <ServicePartitionList, Partition>(request, expectedResultCount, (a, b) => a >= b)); }
public static Predicate <IRetryContext> ExpectedInstanceCount(FabricRequest request, int expectedInstanceCount) { return(FabricRequestProcessor.ExpectedResultCount <TestServicePartitionInfo>(request, expectedInstanceCount)); }
public static Predicate <IRetryContext> MinimumExpectedResultCount <T>(FabricRequest request, int expectedResultCount) { return(FabricRequestProcessor.ResultCountConstraint <T>(request, expectedResultCount, (a, b) => a >= b)); }