void OnRename(object sender, RenamedEventArgs e) { var changeSource = new ChangedSource { ChangesType = e.ChangeType, FilePath = e.FullPath, OldPath = e.OldFullPath }; ChangedSources.Enqueue(changeSource); }
void EnqueueChangeSource(WatcherChangeTypes changeType, string fullPath) { var changeSource = new ChangedSource { ChangesType = changeType, FilePath = fullPath }; if (!IsExcludedFromIndex(changeSource.FilePath, changeType)) { ChangedSources.Enqueue(changeSource); } }
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); } }
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); } } }