public void Indexing_Centralized_Sql_Allocate07_MaxRecords()
        {
            var connectionStringBackup = Configuration.ConnectionStrings.ConnectionString;

            Configuration.ConnectionStrings.ConnectionString = _connectionString;
            try
            {
                CleanupIndexingActivitiesTable();
                var start = new IIndexingActivity[15];
                for (int i = 1; i <= start.Length; i++)
                {
                    start[i - 1] = RegisterActivity(IndexingActivityType.AddDocument, IndexingActivityRunningState.Waiting, i, i, $"/Root/Path0{i}");
                }

                var allocated = DataProvider.Current.LoadExecutableIndexingActivities(new IndexingActivityFactory(), 10, 60);

                Assert.AreEqual(10, allocated.Length);
                for (var i = 0; i < 10; i++)
                {
                    Assert.AreEqual(start[i].Id, allocated[i].Id);
                }
            }
            finally
            {
                Configuration.ConnectionStrings.ConnectionString = connectionStringBackup;
            }
        }
Example #2
0
        private STT.Task ExecuteCentralizedActivityAsync(IIndexingActivity activity, CancellationToken cancellationToken)
        {
            var activityBase = (IndexingActivityBase)activity;

            SnTrace.Index.Write("ExecuteCentralizedActivity: #{0}", activity.Id);
            CentralizedIndexingActivityQueue.ExecuteActivity(activityBase);

            return(activityBase.WaitForCompleteAsync(cancellationToken));
        }
Example #3
0
        /// <summary>
        /// Executes an activity synchronously.
        /// Updates the activity's runningState to "Done" to indicate the end of execution.
        /// Calls the activity's Finish to release the waiting thread.
        /// Removes the activity from the waiting list.
        /// </summary>
        private static void Execute(IIndexingActivity activity)
        {
            var act = (IndexingActivityBase)activity;

            using (var op = SnTrace.Index.StartOperation("CIAQ: A{0} EXECUTION.", act.Id))
            {
                try
                {
#pragma warning disable 420
                    Interlocked.Increment(ref _activeTasks);
#pragma warning restore 420

                    //TODO: [async] refactor this method to be async
                    // execute synchronously
                    using (new Storage.Security.SystemAccount())
                        act.ExecuteIndexingActivityAsync(CancellationToken.None).GetAwaiter().GetResult();

                    // publish the finishing state
                    DataStore.UpdateIndexingActivityRunningStateAsync(act.Id, IndexingActivityRunningState.Done, CancellationToken.None)
                    .GetAwaiter().GetResult();
                }
                catch (Exception e)
                {
                    //TODO: WARNING Do not fill the event log with repetitive messages.
                    SnLog.WriteException(e, $"Indexing activity execution error. Activity: #{act.Id} ({act.ActivityType})");
                    SnTrace.Index.WriteError("CIAQ: A{0} EXECUTION ERROR: {1}", act.Id, e);
                }
                finally
                {
                    // release the waiting thread and remove from the waiting list
                    lock (WaitingActivitiesSync)
                    {
                        act.Finish();
                        WaitingActivities.Remove(act.Id);
                    }

#pragma warning disable 420
                    Interlocked.Decrement(ref _activeTasks);
#pragma warning restore 420
                }
                op.Successful = true;
            }
        }
Example #4
0
        public void Indexing_Centralized_InMemory_Allocate07_MaxRecords()
        {
            using (new Tests.Tools.DataProviderSwindler(new InMemoryDataProvider()))
            {
                var start = new IIndexingActivity[15];
                for (int i = 1; i <= start.Length; i++)
                {
                    start[i - 1] = RegisterActivity(IndexingActivityType.AddDocument, IndexingActivityRunningState.Waiting, i, i, $"/Root/Path0{i}");
                }

                var allocated = DataProvider.Current.LoadExecutableIndexingActivities(new IndexingActivityFactory(), 10, 60);

                Assert.AreEqual(10, allocated.Length);
                for (var i = 0; i < 10; i++)
                {
                    Assert.AreEqual(start[i].Id, allocated[i].Id);
                }
            }
        }
Example #5
0
        public async Task Indexing_Centralized_Allocate07_MaxRecords()
        {
            await NoRepoIntegrationTestAsync(async() =>
            {
                await DP.DeleteAllIndexingActivitiesAsync(CancellationToken.None);
                var start = new IIndexingActivity[15];
                for (int i = 1; i <= start.Length; i++)
                {
                    start[i - 1] = await RegisterActivityAsync(IndexingActivityType.AddDocument, IndexingActivityRunningState.Waiting, i, i, $"/Root/Path0{i}");
                }

                var loaded = await DP.LoadExecutableIndexingActivitiesAsync(new IndexingActivityFactory(), 10, 60, new int[0], CancellationToken.None);

                var activities = loaded.Activities;
                Assert.AreEqual(10, activities.Length);
                for (var i = 0; i < 10; i++)
                {
                    Assert.AreEqual(start[i].Id, activities[i].Id);
                }
            });
        }
Example #6
0
        private async STT.Task ExecuteDistributedActivityAsync(IIndexingActivity activity, CancellationToken cancellationToken)
        {
            var activityBase = (IndexingActivityBase)activity;

            SnTrace.Index.Write("ExecuteDistributedActivity: #{0}", activity.Id);
            await activityBase.DistributeAsync(cancellationToken).ConfigureAwait(false);

            // If there are too many activities in the queue, we have to drop at least the inner
            // data of the activity to prevent memory overflow. We still have to wait for the
            // activity to finish, but the inner data can (and will) be loaded from the db when
            // the time comes for this activity to be executed.
            if (DistributedIndexingActivityQueue.IsOverloaded())
            {
                SnTrace.Index.Write("IAQ OVERLOAD drop activity FromPopulator A:" + activity.Id);
                activity.IndexDocumentData = null;
            }

            // all activities must be executed through the activity queue's API
            DistributedIndexingActivityQueue.ExecuteActivity(activityBase);

            await activityBase.WaitForCompleteAsync(cancellationToken).ConfigureAwait(false);
        }
Example #7
0
        public IIndexingActivity CreateActivity(IndexingActivityType activityType)
        {
            IIndexingActivity activity = null;

            switch (activityType)
            {
            case IndexingActivityType.AddDocument: activity = new AddDocumentActivity(); break;

            case IndexingActivityType.AddTree: activity = new AddTreeActivity(); break;

            case IndexingActivityType.UpdateDocument: activity = new UpdateDocumentActivity(); break;

            case IndexingActivityType.RemoveTree: activity = new RemoveTreeActivity(); break;

            case IndexingActivityType.RemoveDocument: activity = new RemoveDocumentActivity(); break;

            case IndexingActivityType.Rebuild: activity = new RebuildActivity(); break;

            default: throw new NotSupportedException("Unknown IndexingActivityType: " + activityType);
            }
            activity.ActivityType = activityType;
            return(activity);
        }
Example #8
0
 public abstract void RegisterIndexingActivity(IIndexingActivity activity);
Example #9
0
 public STT.Task ExecuteActivityAsync(IIndexingActivity activity, CancellationToken cancellationToken)
 {
     return(_searchManager.SearchEngine.IndexingEngine.IndexIsCentralized
         ? ExecuteCentralizedActivityAsync(activity, cancellationToken)
         : ExecuteDistributedActivityAsync(activity, cancellationToken));
 }
Example #10
0
        /* ------------------------------------------------------------------------------------------ Activity */

        public STT.Task RegisterActivityAsync(IIndexingActivity activity, CancellationToken cancellationToken)
        {
            return(_dataStore.RegisterIndexingActivityAsync(activity, cancellationToken));
        }
Example #11
0
 public Task RegisterIndexingActivityAsync(IIndexingActivity activity, CancellationToken cancellationToken)
 {
     return(DataProvider.RegisterIndexingActivityAsync(activity, cancellationToken));
 }