Exemple #1
0
 private static void Startup(int lastDatabaseId, int lastExecutedId, int[] gaps, System.IO.TextWriter consoleOut)
 {
     Serializer.Reset();
     DependencyManager.Reset();
     TerminationHistory.Reset(lastExecutedId, gaps);
     Serializer.Start(lastDatabaseId, lastExecutedId, gaps, consoleOut);
 }
Exemple #2
0
            internal static void Finish(SecurityActivity activity)
            {
                lock (_waitingSetLock)
                {
                    // activity is done in the ActivityQueue
                    _waitingSet.Remove(activity);

                    // terminate and release waiting threads if there is any.
                    activity.Finish();

                    // register activity termination in the log.
                    SecurityActivityHistory.Finish(activity.Id);

                    // register activity termination.
                    TerminationHistory.FinishActivity(activity);

                    // execute all activities that are completely freed.
                    foreach (var dependentItem in activity.WaitingForMe.ToArray())
                    {
                        dependentItem.FinishWaiting(activity);
                        if (dependentItem.WaitingFor.Count == 0)
                        {
                            Task.Run(() => Executor.Execute(dependentItem));
                        }
                    }
                }
            }
 /// <summary>
 /// Retrieves a generic collection of all verifications of terminated candidacy on record for the specified candidate and election cycle.
 /// </summary>
 /// <param name="candidateID">The ID of the candidate whose verifications of terminated candidacy are to be retrieved.</param>
 /// <param name="electionCycle">The election cycle in which to search.</param>
 /// <returns>A generic List collection of all verifications of terminated candidacy on record for the specified candidate and election cycle.</returns>
 public TerminationHistory GetTerminationVerifications(string candidateID, string electionCycle)
 {
     using (TerminationVerificationTds ds = new TerminationVerificationTds())
     {
         using (TerminationVerificationsTableAdapter ta = new TerminationVerificationsTableAdapter())
         {
             ta.Fill(ds.TerminationVerifications, candidateID, electionCycle);
         }
         TerminationHistory c = new TerminationHistory(ds.TerminationVerifications.Count);
         foreach (TerminationVerificationTds.TerminationVerificationsRow row in ds.TerminationVerifications.Rows)
         {
             c.Documents.Add(new TerminationVerification(row.Number, row.LastUpdated)
             {
                 PageCount      = row.PageCount,
                 StatusReason   = CPConvert.ToDocumentStatusReason(row.ReasonCode.Trim()),
                 Status         = CPConvert.ToDocumentStatus(row.StatusCode.Trim()),
                 DeliveryType   = CPConvert.ToDeliveryType(row.DeliveryCode.Trim()),
                 SubmissionType = CPConvert.ToSubmissionType(row.SubmissionCode.Trim()),
                 ReceivedDate   = row.IsReceivedDateNull() ? null : row.ReceivedDate as DateTime?,
                 StatusDate     = row.IsStatusDateNull() ? null : row.StatusDate as DateTime?,
                 PostmarkDate   = row.IsPostmarkDateNull() ? null : row.PostmarkDate as DateTime?
             });
         }
         return(c);
     }
 }
Exemple #4
0
            internal static void Finish(IndexingActivityBase activity)
            {
                lock (WaitingSetLock)
                {
                    // activity is done in the ActivityQueue
                    WaitingSet.Remove(activity);

                    // terminate and release waiting threads if there is any.
                    activity.Finish();

                    // register activity termination in the log.
                    IndexingActivityHistory.Finish(activity.Id);

                    // register activity termination if the activity was not skipped.
                    if (activity.Executed)
                    {
                        TerminationHistory.FinishActivity(activity);
                    }

                    // execute all activities that are completely freed.
                    foreach (var dependentItem in activity.WaitingForMe.ToArray())
                    {
                        dependentItem.FinishWaiting(activity);
                        if (dependentItem.WaitingFor.Count == 0)
                        {
                            System.Threading.Tasks.Task.Run(() => Executor.Execute(dependentItem));
                        }
                    }
                }
            }
Exemple #5
0
 public DependencyManager(Serializer serializer, Executor executor, TerminationHistory terminationHistory,
                          SecurityActivityHistoryController activityHistory)
 {
     _serializer         = serializer;
     _executor           = executor;
     _terminationHistory = terminationHistory;
     _activityHistory    = activityHistory;
 }
Exemple #6
0
 public static SecurityActivityQueueState GetCurrentState()
 {
     return(new SecurityActivityQueueState
     {
         Serializer = Serializer.GetCurrentState(),
         DependencyManager = DependencyManager.GetCurrentState(),
         Termination = TerminationHistory.GetCurrentState()
     });
 }
        public DistributedIndexingActivityQueue(IndexManager indexManager)
        {
            _terminationHistory = new TerminationHistory();
            _activityHistory    = new IndexingActivityHistoryController(this);
            _dependencyManager  = new DependencyManager(_terminationHistory, _activityHistory);
            _serializer         = new Serializer(this, _dependencyManager, _terminationHistory, _activityHistory, indexManager);
            var executor = new Executor(_dependencyManager, _activityHistory, indexManager);

            _dependencyManager.SetDependencies(_serializer, executor);
        }
Exemple #8
0
        internal static void Startup(CompletionState uncompleted, int lastActivityIdFromDb)
        {
            CommunicationMonitor.Stop();

            Serializer.Reset();
            DependencyManager.Reset();
            TerminationHistory.Reset(uncompleted.LastActivityId, uncompleted.Gaps);
            Serializer.Start(lastActivityIdFromDb, uncompleted.LastActivityId, uncompleted.Gaps);

            CommunicationMonitor.Start();
        }
 internal Serializer(DistributedIndexingActivityQueue activityQueue,
                     DependencyManager dependencyManager,
                     TerminationHistory terminationHistory,
                     IndexingActivityHistoryController activityHistory
                     , IndexManager indexManager)
 {
     _activityQueue      = activityQueue;
     _dependencyManager  = dependencyManager;
     _terminationHistory = terminationHistory;
     _activityHistory    = activityHistory;
     _indexManager       = indexManager;
 }
 /// <summary>
 /// Raises the <see mref="Load"/> event.
 /// </summary>
 /// <param name="args">An <see cref="EventArgs"/> object that contains the event data.</param>
 protected override void OnLoad(EventArgs args)
 {
     base.OnLoad(args);
     if (!Page.IsPostBack)
     {
         TerminationHistory th = CPProfile.TerminationHistory;
         if (th != null)
         {
             this.EnsureChildControls();
             this.DataSource = th.Documents;
             this.DataBind();
         }
     }
 }
Exemple #11
0
        public SecurityActivityQueue(SecuritySystem securitySystem, CommunicationMonitor communicationMonitor,
                                     DataHandler dataHandler, SecurityActivityHistoryController activityHistory)
        {
            _securitySystem               = securitySystem;
            _communicationMonitor         = communicationMonitor;
            _dataHandler                  = dataHandler;
            _serializer                   = new Serializer(this, activityHistory, dataHandler);
            _executor                     = new Executor(activityHistory);
            _terminationHistory           = new TerminationHistory();
            _dependencyManager            = new DependencyManager(_serializer, _executor, _terminationHistory, activityHistory);
            _serializer.DependencyManager = _dependencyManager;
            _executor.DependencyManager   = _dependencyManager;

            communicationMonitor.HearthBeat += (sender, args) => HealthCheck();
        }
Exemple #12
0
        internal static void HealthCheck()
        {
            if (IsWorking())
            {
                SnTrace.Index.Write("IAQ: Health check triggered but ignored.");
                return;
            }

            SnTrace.Index.Write("IAQ: Health check triggered.");

            var state      = TerminationHistory.GetCurrentState();
            var gapsLength = state.Gaps.Length;

            if (gapsLength > 0)
            {
                SnTrace.IndexQueue.Write("IAQ: Health checker is processing {0} gap{1}.", gapsLength, gapsLength > 1 ? "s" : "");

                var notLoadedIds = state.Gaps.ToList();
                foreach (var indexingActivity in new IndexingActivityLoader(state.Gaps, false))
                {
                    var activity = (IndexingActivityBase)indexingActivity;
                    WaitIfOverloaded();
                    ExecuteActivity(activity);
                    notLoadedIds.Remove(activity.Id);
                }

                if (notLoadedIds.Count > 0)
                {
                    TerminationHistory.RemoveGaps(notLoadedIds);
                    SnTrace.IndexQueue.Write("IAQ: Health checker ignores the following activity ids after processing the gaps: {0}", notLoadedIds);
                }
            }

            var lastId   = TerminationHistory.GetLastTerminatedId();
            var lastDbId = IndexManager.GetLastStoredIndexingActivityId();

            if (lastId < lastDbId)
            {
                SnTrace.IndexQueue.Write("IAQ: Health checker is processing activities from {0} to {1}", (lastId + 1), lastDbId);

                foreach (var indexingActivity in new IndexingActivityLoader(lastId + 1, lastDbId, false))
                {
                    var activity = (IndexingActivityBase)indexingActivity;
                    WaitIfOverloaded();
                    ExecuteActivity(activity);
                }
            }
        }
Exemple #13
0
        internal static void HealthCheck()
        {
            if (IsWorking())
            {
                SnTrace.Index.Write("IAQ: Health check triggered but ignored.");

                return;
            }

            SnTrace.Index.Write("IAQ: Health check triggered.");


            var state      = TerminationHistory.GetCurrentState();
            var gapsLength = state.Gaps.Length;

            if (gapsLength > 0)
            {
                SnTrace.IndexQueue.Write("IAQ: Health checker is processing {0} gap{1}.", gapsLength, gapsLength > 1 ? "s" : "");

                foreach (LuceneIndexingActivity activity in new IndexingActivityLoader(state.Gaps, false))
                {
                    WaitIfOverloaded();
                    IndexingActivityQueue.ExecuteActivity(activity);
                }
            }

            var lastId     = TerminationHistory.GetLastTerminatedId();
            var lastDbId   = LuceneManager.GetLastStoredIndexingActivityId();
            var newerCount = lastDbId - lastId;

            if (lastId < lastDbId)
            {
                SnTrace.IndexQueue.Write("IAQ: Health checker is processing activities from {0} to {1}", (lastId + 1), lastDbId);

                foreach (LuceneIndexingActivity activity in new IndexingActivityLoader(lastId + 1, lastDbId, false))
                {
                    WaitIfOverloaded();
                    IndexingActivityQueue.ExecuteActivity(activity);
                }
            }
        }
Exemple #14
0
        internal static void HealthCheck()
        {
            if (IsWorking())
            {
                SnTrace.Security.Write("SAQ: Health check triggered but ignored.");
                return;
            }
            SnTrace.Security.Write("SAQ: Health check triggered.");

            var state      = TerminationHistory.GetCurrentState();
            var gapsLength = state.Gaps.Length;

            if (gapsLength > 0)
            {
                SnTrace.SecurityQueue.Write("SAQ: Health checker is processing {0} gap{1}.", gapsLength, gapsLength > 1 ? "s" : "");

                var notLoaded = state.Gaps.ToList();
                foreach (var activity in new SecurityActivityLoader(state.Gaps, false))
                {
                    SecurityActivityQueue.ExecuteActivity(activity);
                    // memorize executed
                    notLoaded.Remove(activity.Id);
                }
                // forget not loaded activities.
                TerminationHistory.RemoveFromGaps(notLoaded);
            }

            var lastId   = TerminationHistory.GetLastTerminatedId();
            var lastDbId = DataHandler.GetLastSecurityActivityId(SecurityContext.StartedAt);

            if (lastId < lastDbId)
            {
                SnTrace.SecurityQueue.Write("SAQ: Health checker is processing activities from {0} to {1}", lastId + 1, lastDbId);
                foreach (var activity in new SecurityActivityLoader(lastId + 1, lastDbId, false))
                {
                    SecurityActivityQueue.ExecuteActivity(activity);
                }
            }
        }
 internal DependencyManager(TerminationHistory terminationHistory, IndexingActivityHistoryController activityHistory)
 {
     _terminationHistory = terminationHistory;
     _activityHistory    = activityHistory;
 }
 internal static void Shutdown()
 {
     Serializer.Reset();
     DependencyManager.Reset();
     TerminationHistory.Reset(0);
 }
Exemple #17
0
            /// <summary>
            /// MUST BE SYNCHRON
            /// GAPS MUST BE ORDERED
            /// </summary>
            internal static void Start(int lastDatabaseId, int lastExecutedId, int[] gaps, System.IO.TextWriter consoleOut)
            {
                if (consoleOut != null)
                {
                    consoleOut.WriteLine("Executing unprocessed activities. {0}-{1} {2}", lastExecutedId, lastDatabaseId, CompletionState.GapsToString(gaps, 5, 3));
                }

                SnLog.WriteInformation("Executing unprocessed activities.",
                                       EventId.RepositoryRuntime,
                                       properties: new Dictionary <string, object> {
                    { "LastDatabaseId", lastDatabaseId },
                    { "LastExecutedId", lastExecutedId },
                    { "CountOfGaps", gaps.Length },
                    { "Gaps", String.Join(", ", gaps) }
                });

                DependencyManager.Start();

                var count = 0;

                if (gaps.Any())
                {
                    var loadedActivities = new IndexingActivityLoader(gaps, true);
                    foreach (LuceneIndexingActivity loadedActivity in loadedActivities)
                    {
                        // wait and start processing loaded activities in the meantime
                        WaitIfOverloaded(true);

                        SnTrace.IndexQueue.Write("IAQ: Startup: A{0} enqueued from db.", loadedActivity.Id);

                        IndexingActivityHistory.Arrive(loadedActivity);
                        _arrivalQueue.Enqueue(loadedActivity);
                        _lastQueued = loadedActivity.Id;
                        count++;
                    }
                }
                if (lastExecutedId < lastDatabaseId)
                {
                    var loadedActivities = new IndexingActivityLoader(lastExecutedId + 1, lastDatabaseId, true);
                    foreach (LuceneIndexingActivity loadedActivity in loadedActivities)
                    {
                        // wait and start processing loaded activities in the meantime
                        WaitIfOverloaded(true);

                        SnTrace.IndexQueue.Write("IAQ: Startup: A{0} enqueued from db.", loadedActivity.Id);

                        IndexingActivityHistory.Arrive(loadedActivity);
                        _arrivalQueue.Enqueue(loadedActivity);
                        _lastQueued = loadedActivity.Id;
                        count++;
                    }
                }

                if (_lastQueued < lastExecutedId)
                {
                    _lastQueued = lastExecutedId;
                }

                // ensure that the arrival activity queue is not empty at this pont.
                DependencyManager.ActivityEnqueued();

                if (lastDatabaseId != 0 || lastExecutedId != 0 || gaps.Any())
                {
                    while (IsWorking())
                    {
                        Thread.Sleep(200);
                    }
                }

                // At this point we know for sure that the original gap is not there anymore.
                // In case there is a false gap (e.g. because there are missing activity ids
                // in the db) we have to remove these ids manually from the in-memory gap.
                if (gaps.Any())
                {
                    TerminationHistory.RemoveGaps(gaps);

                    // Commit is necessary because otherwise the gap is removed only in memory, but
                    // the index is not updated in the file system.
                    LuceneManager.Commit();
                }

                SnLog.WriteInformation($"Executing unprocessed activities ({count}) finished.", EventId.RepositoryLifecycle);
            }
Exemple #18
0
 public static CompletionState GetCurrentCompletionState()
 {
     return(TerminationHistory.GetCurrentState());
 }
Exemple #19
0
 public static IndexingActivityStatus GetCurrentCompletionState()
 {
     return(TerminationHistory.GetCurrentState());
 }
Exemple #20
0
 /// <summary>Only for tests</summary>
 internal static void _setCurrentExecutionState(CompletionState state)
 {
     Serializer.Reset(state.LastActivityId);
     DependencyManager.Reset();
     TerminationHistory.Reset(state.LastActivityId, state.Gaps);
 }
Exemple #21
0
            /// <summary>
            /// MUST BE SYNCHRON
            /// GAPS MUST BE ORDERED
            /// </summary>
            internal static void Start(int lastDatabaseId, int lastExecutedId, int[] gaps, System.IO.TextWriter consoleOut)
            {
                consoleOut?.WriteLine("Executing unprocessed activities. {0}-{1} {2}", lastExecutedId, lastDatabaseId, IndexingActivityStatus.GapsToString(gaps, 5, 3));

                SnLog.WriteInformation("Executing unprocessed activities.",
                                       EventId.RepositoryRuntime,
                                       properties: new Dictionary <string, object> {
                    { "LastDatabaseId", lastDatabaseId },
                    { "LastExecutedId", lastExecutedId },
                    { "CountOfGaps", gaps.Length },
                    { "Gaps", IndexingActivityStatus.GapsToString(gaps, 100, 3) }
                });

                IndexingActivityBase.NotIndexableContentCollection.Clear();
                DependencyManager.Start();

                var count = 0;

                if (gaps.Any())
                {
                    var loadedActivities = new IndexingActivityLoader(gaps, true);
                    foreach (var indexingActivity in loadedActivities)
                    {
                        var loadedActivity = (IndexingActivityBase)indexingActivity;
                        // wait and start processing loaded activities in the meantime
                        WaitIfOverloaded(true);

                        SnTrace.IndexQueue.Write("IAQ: Startup: A{0} enqueued from db.", loadedActivity.Id);

                        IndexingActivityHistory.Arrive(loadedActivity);
                        ArrivalQueue.Enqueue(loadedActivity);
                        _lastQueued = loadedActivity.Id;
                        count++;
                    }
                }
                if (lastExecutedId < lastDatabaseId)
                {
                    var loadedActivities = new IndexingActivityLoader(lastExecutedId + 1, lastDatabaseId, true);
                    foreach (var indexingActivity in loadedActivities)
                    {
                        var loadedActivity = (IndexingActivityBase)indexingActivity;
                        // wait and start processing loaded activities in the meantime
                        WaitIfOverloaded(true);

                        SnTrace.IndexQueue.Write("IAQ: Startup: A{0} enqueued from db.", loadedActivity.Id);

                        IndexingActivityHistory.Arrive(loadedActivity);
                        ArrivalQueue.Enqueue(loadedActivity);
                        _lastQueued = loadedActivity.Id;
                        count++;
                    }
                }

                if (_lastQueued < lastExecutedId)
                {
                    _lastQueued = lastExecutedId;
                }

                // ensure that the arrival activity queue is not empty at this pont.
                DependencyManager.ActivityEnqueued();

                if (lastDatabaseId != 0 || lastExecutedId != 0 || gaps.Any())
                {
                    while (IsWorking())
                    {
                        Thread.Sleep(200);
                    }
                }

                if (IndexingActivityBase.NotIndexableContentCollection.Any())
                {
                    const int maxWrittenCount = 100;

                    // Collect the first n ContentId, VersionId pairs into one message
                    // (key: version id, value: content id).
                    var data = string.Join("; ", IndexingActivityBase.NotIndexableContentCollection.Take(maxWrittenCount)
                                           .OrderBy(x => x.Value)
                                           .Select(x => $"{x.Value},{x.Key}"));
                    var firstN = IndexingActivityBase.NotIndexableContentCollection.Count > maxWrittenCount
                        ? $" first {maxWrittenCount}"
                        : string.Empty;

                    // Write one aggregated message
                    SnLog.WriteWarning($"Cannot index {IndexingActivityBase.NotIndexableContentCollection.Count}" +
                                       $" content. The{firstN} related ContentId, VersionId pairs: {data}");

                    // Do not keep memory for unnecessary data
                    IndexingActivityBase.NotIndexableContentCollection.Clear();
                }

                // At this point we know for sure that the original gap is not there anymore.
                // In case there is a false gap (e.g. because there are missing activity ids
                // in the db) we have to remove these ids manually from the in-memory gap.
                if (gaps.Any())
                {
                    TerminationHistory.RemoveGaps(gaps);

                    // Commit is necessary because otherwise the gap is removed only in memory, but
                    // the index is not updated in the file system.
                    IndexManager.CommitAsync(CancellationToken.None).GetAwaiter().GetResult(); // explicit commit
                }

                SnLog.WriteInformation($"Executing unprocessed activities ({count}) finished.", EventId.RepositoryLifecycle);
            }