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(); }