/// <summary> /// Removes associations with all blocking requests and throws an exception. /// </summary> private void CleanupForCircularDependencyAndThrow(SchedulableRequest requestCausingFailure, List <SchedulableRequest> ancestors) { if (_requestsWeAreBlockedBy.Count != 0) { List <SchedulableRequest> tempRequests = new List <SchedulableRequest>(_requestsWeAreBlockedBy.Values); foreach (SchedulableRequest requestWeAreBlockedBy in tempRequests) { BlockingRequestKey key = new BlockingRequestKey(requestWeAreBlockedBy.BuildRequest); DisconnectRequestWeAreBlockedBy(key); } } else { ChangeToState(SchedulableRequestState.Ready); } _activeTargetsWhenBlocked = null; // The blocking request itself is no longer valid if it was unscheduled. if (requestCausingFailure.State == SchedulableRequestState.Unscheduled) { requestCausingFailure.Delete(); } throw new SchedulerCircularDependencyException(requestCausingFailure.BuildRequest, ancestors); }
/// <summary> /// Removes the association between this request and the one we are blocked by. /// </summary> private void DisconnectRequestWeAreBlockedBy(BlockingRequestKey blockingRequestKey) { ErrorUtilities.VerifyThrow(_requestsWeAreBlockedBy.ContainsKey(blockingRequestKey), "We are not blocked by the specified request."); SchedulableRequest unblockingRequest = _requestsWeAreBlockedBy[blockingRequestKey]; ErrorUtilities.VerifyThrow(unblockingRequest._requestsWeAreBlocking.Contains(this), "The request unblocking us doesn't think it is blocking us."); _requestsWeAreBlockedBy.Remove(blockingRequestKey); unblockingRequest._requestsWeAreBlocking.Remove(this); // If the request we are blocked by also happens to be unscheduled, remove it as well so we don't try to run it later. This is // because circular dependency errors cause us to fail all outstanding requests on the current request. See BuildRequsetEntry.ReportResult. if (unblockingRequest.State == SchedulableRequestState.Unscheduled) { unblockingRequest.Delete(); } if (_requestsWeAreBlockedBy.Count == 0) { ChangeToState(SchedulableRequestState.Ready); } }
/// <summary> /// Removes associations with all blocking requests and throws an exception. /// </summary> private void CleanupForCircularDependencyAndThrow(SchedulableRequest requestCausingFailure, List<SchedulableRequest> ancestors) { if (_requestsWeAreBlockedBy.Count != 0) { List<SchedulableRequest> tempRequests = new List<SchedulableRequest>(_requestsWeAreBlockedBy.Values); foreach (SchedulableRequest requestWeAreBlockedBy in tempRequests) { BlockingRequestKey key = new BlockingRequestKey(requestWeAreBlockedBy.BuildRequest); DisconnectRequestWeAreBlockedBy(key); } } else { ChangeToState(SchedulableRequestState.Ready); } _activeTargetsWhenBlocked = null; // The blocking request itself is no longer valid if it was unscheduled. if (requestCausingFailure.State == SchedulableRequestState.Unscheduled) { requestCausingFailure.Delete(); } throw new SchedulerCircularDependencyException(requestCausingFailure.BuildRequest, ancestors); }