private async Task CleanIndexFromNonExistentBucketsAsync(IEnumerable <Uri> buckets, ILogger logger, CancellationToken cancellationToken) { var allBucketsFromIndex = await _indexer.GetBucketsAsync(cancellationToken); var deletedBuckets = allBucketsFromIndex.Except(buckets).ToArray(); logger.LogInformation($"{deletedBuckets.Length} buckets to remove from the index."); await Parallel.ForEachAsync( deletedBuckets.TakeWhile(x => !cancellationToken.IsCancellationRequested), new ParallelOptions() { MaxDegreeOfParallelism = MaxDegreeOfParallelism, CancellationToken = cancellationToken }, async (deletedBucket, cancellationToken) => { var manifests = (await _indexer.GetExistingManifestsAsync(deletedBucket, cancellationToken)).ToArray(); logger.LogDebug($"Deleting {manifests.Length} manifests from bucket {deletedBucket}."); await _indexer.DeleteManifestsAsync(manifests, cancellationToken); }); }