Example #1
0
        void OnRename(object sender, RenamedEventArgs e)
        {
            var changeSource = new ChangedSource
            {
                ChangesType = e.ChangeType,
                FilePath    = e.FullPath,
                OldPath     = e.OldFullPath
            };

            ChangedSources.Enqueue(changeSource);
        }
Example #2
0
        void EnqueueChangeSource(WatcherChangeTypes changeType, string fullPath)
        {
            var changeSource = new ChangedSource
            {
                ChangesType = changeType,
                FilePath    = fullPath
            };

            if (!IsExcludedFromIndex(changeSource.FilePath, changeType))
            {
                ChangedSources.Enqueue(changeSource);
            }
        }
Example #3
0
        async Task MaintainIndexesCore()
        {
            FetchIntervalSeconds.RequireRange(nameof(FetchIntervalSeconds), 3, 1);

            while (!TokenSource.Token.IsCancellationRequested)
            {
                TokenSource.Token.ThrowIfCancellationRequested();

                var fetchEndDate     = DateTime.UtcNow.AddSeconds(-FetchIntervalSeconds * 2);
                var notChangedDuring = fetchEndDate.AddSeconds(FetchIntervalSeconds);
                if (ChangedSources.Count(u => u.ChangedUTCDate > fetchEndDate && u.ChangedUTCDate <= notChangedDuring) == 0)
                {
                    var orderedNeedProcessingChanges = ChangedSources.Where(u => u.ChangedUTCDate <= fetchEndDate).ToList();
                    if (orderedNeedProcessingChanges.Count > 0)
                    {
                        foreach (var _ in orderedNeedProcessingChanges)
                        {
                            ChangedSources.TryDequeue(out var _);
                        }

                        ProcessingChanges(orderedNeedProcessingChanges);

                        IndexBuilder.Commit();

                        TriggerCommitFinished();
                    }
                }

                TokenSource.Token.ThrowIfCancellationRequested();

                var fetchRetryEndDate = DateTime.UtcNow.AddSeconds(-3);
                var needRetry         = PendingRetryCodeSources.Count(u => u.LastRetryUTCDate <= fetchRetryEndDate);
                if (needRetry > 0)
                {
                    var needRetrySources = new List <ChangedSource>();
                    for (var index = 0; index < needRetry; index++)
                    {
                        if (PendingRetryCodeSources.TryDequeue(out var pendingRetrySource))
                        {
                            needRetrySources.Add(pendingRetrySource);
                        }
                    }

                    ProcessingChanges(needRetrySources.OrderBy(u => u.ChangedUTCDate).ToList(), true);

                    IndexBuilder.Commit();
                }

                await Task.Delay(FetchIntervalSeconds * 1000, TokenSource.Token);
            }
        }
Example #4
0
 void CreateIndex(ChangedSource changes, IList <ChangedSource> orderedNeedProcessingChanges)
 {
     if (IsFile(changes.FilePath))
     {
         if (IndexBuilder.CreateIndex(new FileInfo(changes.FilePath)) == IndexBuildResults.FailedWithIOException)
         {
             EnqueueToFailedSource(changes);
         }
     }
     else if (IsDirectory(changes.FilePath))
     {
         foreach (var file in Directory.GetFiles(changes.FilePath, "*", SearchOption.AllDirectories).Where(file =>
                                                                                                           orderedNeedProcessingChanges.All(changedSource => !changedSource.FilePath.Equals(file, StringComparison.InvariantCultureIgnoreCase)) &&
                                                                                                           ChangedSources.All(changedSource => !changedSource.FilePath.Equals(file, StringComparison.InvariantCultureIgnoreCase))))
         {
             Log.LogInformation($"{IndexConfig.IndexName}: Enqueue File {file} Created to changes source");
             EnqueueChangeSource(WatcherChangeTypes.Created, file);
         }
     }
 }