Beispiel #1
0
 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();
         }
     }
 }
Beispiel #2
0
        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));
        }
Beispiel #3
0
        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();
                }
            }
        }
Beispiel #4
0
        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
                    });
                }
            }
        }
Beispiel #5
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);
     }
 }