Exemple #1
0
        private async Task ConfigureIndexInternalAsync(IIndex idx, bool beginReindexingOutdated)
        {
            await idx.ConfigureAsync().AnyContext();

            await idx.MaintainAsync(includeOptionalTasks : false).AnyContext();

            if (!beginReindexingOutdated)
            {
                return;
            }

            if (_workItemQueue == null || _beginReindexLockProvider == null)
            {
                throw new InvalidOperationException("Must specify work item queue and lock provider in order to reindex.");
            }

            if (!(idx is IVersionedIndex versionedIndex))
            {
                return;
            }

            int currentVersion = await versionedIndex.GetCurrentVersionAsync().AnyContext();

            if (versionedIndex.Version <= currentVersion)
            {
                return;
            }

            var  reindexWorkItem = versionedIndex.CreateReindexWorkItem(currentVersion);
            bool isReindexing    = await _lockProvider.IsLockedAsync(String.Join(":", "reindex", reindexWorkItem.Alias,
                                                                                 reindexWorkItem.OldIndex, reindexWorkItem.NewIndex)).AnyContext();

            if (isReindexing)
            {
                return;
            }

            // enqueue reindex to new version, only allowed every 15 minutes
            string enqueueReindexLockName = String.Join(":", "enqueue-reindex", reindexWorkItem.Alias, reindexWorkItem.OldIndex, reindexWorkItem.NewIndex);
            await _beginReindexLockProvider.TryUsingAsync(enqueueReindexLockName, () => _workItemQueue.EnqueueAsync(reindexWorkItem), TimeSpan.Zero, new CancellationToken(true)).AnyContext();
        }