示例#1
0
        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));
 }