protected override void StopSearch() { Factory.Current.LocalTaskTracer.TraceDebug <Guid>((long)this.GetHashCode(), "Correlation Id:{0}. Search was cancelled", base.ExecutingUser.QueryCorrelationId); lock (this.locker) { if (this.completed != this.totalTasks) { this.cancelled = true; foreach (ISearchMailboxTask searchMailboxTask in this.queue) { Factory.Current.LocalTaskTracer.TraceDebug((long)this.GetHashCode(), "Correlation Id:{0}. Removing {1} Search task on {2} mailboxes on {3} database from the queue", new object[] { base.ExecutingUser.QueryCorrelationId, (searchMailboxTask.Type == SearchType.Preview) ? "Preview" : "Statistics", ((AggregatedMailboxSearchTask)searchMailboxTask).MailboxInfoList.Count, ((AggregatedMailboxSearchTask)searchMailboxTask).MailboxDatabaseGuid }); AggregatedMailboxSearchTask aggregatedMailboxSearchTask = searchMailboxTask as AggregatedMailboxSearchTask; base.ResultAggregator.MergeSearchResult((AggregatedSearchTaskResult)searchMailboxTask.GetErrorResult(new DiscoverySearchTaskCancelled(aggregatedMailboxSearchTask.MailboxInfoList, aggregatedMailboxSearchTask.MailboxDatabaseGuid))); this.completed++; } foreach (ISearchMailboxTask searchMailboxTask2 in this.scheduledTasks) { Factory.Current.LocalTaskTracer.TraceDebug <Guid, string, int>((long)this.GetHashCode(), "Correlation Id:{0}. Cancelling {1} Search task on {2} mailboxes. Merging error with the result.", base.ExecutingUser.QueryCorrelationId, (searchMailboxTask2.Type == SearchType.Preview) ? "Preview" : "Statistics", ((AggregatedMailboxSearchTask)searchMailboxTask2).MailboxInfoList.Count); AggregatedMailboxSearchTask aggregatedMailboxSearchTask2 = searchMailboxTask2 as AggregatedMailboxSearchTask; aggregatedMailboxSearchTask2.Abort(); base.ResultAggregator.MergeSearchResult((AggregatedSearchTaskResult)searchMailboxTask2.GetErrorResult(new DiscoverySearchTaskCancelled(aggregatedMailboxSearchTask2.MailboxInfoList, aggregatedMailboxSearchTask2.MailboxDatabaseGuid))); this.completed++; } this.ReportCompletion(); } } }
private void Worker(object state) { AggregatedMailboxSearchTask aggregatedMailboxSearchTask = (AggregatedMailboxSearchTask)state; Factory.Current.LocalTaskTracer.TraceDebug((long)this.GetHashCode(), "Correlation Id:{0}. Initiating {1} Search on {2} mailboxes for query of length {3} with {4} keywords.", new object[] { base.ExecutingUser.QueryCorrelationId, (aggregatedMailboxSearchTask.Type == SearchType.Preview) ? "Preview" : "Statistics", aggregatedMailboxSearchTask.MailboxInfoList.Count, string.IsNullOrEmpty(aggregatedMailboxSearchTask.SearchCriteria.QueryString) ? 0 : aggregatedMailboxSearchTask.SearchCriteria.QueryString.Trim().Length, (aggregatedMailboxSearchTask.SearchCriteria.SubFilters != null && aggregatedMailboxSearchTask.SearchCriteria.SubFilters.Keys.Count > 0) ? aggregatedMailboxSearchTask.SearchCriteria.SubFilters.Keys.Count : 0 }); aggregatedMailboxSearchTask.Execute(new SearchCompletedCallback(this.SearchCompletedCallback)); }
private void HandleSearchCompletion(ISearchMailboxTask task, ISearchTaskResult result) { AggregatedMailboxSearchTask aggregatedMailboxSearchTask = task as AggregatedMailboxSearchTask; lock (this.locker) { Factory.Current.LocalTaskTracer.TraceDebug((long)this.GetHashCode(), "Correlation Id:{0}. {1} Search completed on {2} mailboxes, with query of length {3} with {4} keywords.The result was {5}", new object[] { base.ExecutingUser.QueryCorrelationId, (task.Type == SearchType.Preview) ? "Preview" : "Statistics", aggregatedMailboxSearchTask.MailboxInfoList.Count, string.IsNullOrEmpty(aggregatedMailboxSearchTask.SearchCriteria.QueryString) ? 0 : aggregatedMailboxSearchTask.SearchCriteria.QueryString.Trim().Length, (aggregatedMailboxSearchTask.SearchCriteria.SubFilters != null && aggregatedMailboxSearchTask.SearchCriteria.SubFilters.Keys.Count > 0) ? aggregatedMailboxSearchTask.SearchCriteria.SubFilters.Keys.Count : 0, (result != null && result.Success) ? "Success" : "Failure" }); this.tasksInProgress--; this.scheduledTasks.Remove(task); if (result != null && task.ShouldRetry(result)) { Factory.Current.LocalTaskTracer.TraceDebug((long)this.GetHashCode(), "Correlation Id:{0}. Retrying {1} Search completed on {2} mailboxes, with query of length {3} with {4} keywords.", new object[] { base.ExecutingUser.QueryCorrelationId, (task.Type == SearchType.Preview) ? "Preview" : "Statistics", aggregatedMailboxSearchTask.MailboxInfoList.Count, string.IsNullOrEmpty(aggregatedMailboxSearchTask.SearchCriteria.QueryString) ? 0 : aggregatedMailboxSearchTask.SearchCriteria.QueryString.Trim().Length, (aggregatedMailboxSearchTask.SearchCriteria.SubFilters != null && aggregatedMailboxSearchTask.SearchCriteria.SubFilters.Keys.Count > 0) ? aggregatedMailboxSearchTask.SearchCriteria.SubFilters.Keys.Count : 0 }); this.queue.Enqueue(task); } else { this.completed++; if (result != null) { base.ResultAggregator.MergeSearchResult(result); } aggregatedMailboxSearchTask.Dispose(); if (this.completed == this.totalTasks) { this.ReportCompletion(); } } if (!this.cancelled) { this.Dispatch(); } } }
private void SearchCompletedCallback(ISearchMailboxTask task, ISearchTaskResult result) { AggregatedMailboxSearchTask aggregatedMailboxSearchTask = task as AggregatedMailboxSearchTask; lock (this.locker) { if (!this.cancelled) { this.HandleSearchCompletion(task, result); } else { Factory.Current.LocalTaskTracer.TraceDebug((long)this.GetHashCode(), "Correlation Id:{0}. {1} Search completed on {2} mailboxes, with query of length {3} with {4} keywords. But not merging the results because search was cancelled.", new object[] { base.ExecutingUser.QueryCorrelationId, (task.Type == SearchType.Preview) ? "Preview" : "Statistics", aggregatedMailboxSearchTask.MailboxInfoList.Count, string.IsNullOrEmpty(aggregatedMailboxSearchTask.SearchCriteria.QueryString) ? 0 : aggregatedMailboxSearchTask.SearchCriteria.QueryString.Trim().Length, (aggregatedMailboxSearchTask.SearchCriteria.SubFilters != null && aggregatedMailboxSearchTask.SearchCriteria.SubFilters.Keys.Count > 0) ? aggregatedMailboxSearchTask.SearchCriteria.SubFilters.Keys.Count : 0 }); } } }
private void Dispatch() { while (this.tasksInProgress < this.maxNumberOfTasks) { if (this.queue.Count == 0) { return; } ISearchMailboxTask searchMailboxTask = this.queue.Dequeue(); AggregatedMailboxSearchTask aggregatedMailboxSearchTask = searchMailboxTask as AggregatedMailboxSearchTask; this.tasksInProgress++; this.scheduledTasks.Add(searchMailboxTask); Factory.Current.LocalTaskTracer.TraceDebug((long)this.GetHashCode(), "Correlation Id:{0}. Queuing {1} Search on {2} mailboxes for query of length {3} with {4} keywords.", new object[] { base.ExecutingUser.QueryCorrelationId, (searchMailboxTask.Type == SearchType.Preview) ? "Preview" : "Statistics", aggregatedMailboxSearchTask.MailboxInfoList.Count, string.IsNullOrEmpty(aggregatedMailboxSearchTask.SearchCriteria.QueryString) ? 0 : aggregatedMailboxSearchTask.SearchCriteria.QueryString.Trim().Length, (aggregatedMailboxSearchTask.SearchCriteria.SubFilters != null && aggregatedMailboxSearchTask.SearchCriteria.SubFilters.Keys.Count > 0) ? aggregatedMailboxSearchTask.SearchCriteria.SubFilters.Keys.Count : 0 }); ThreadPool.QueueUserWorkItem(new WaitCallback(this.Worker), aggregatedMailboxSearchTask); } }