public PartitionHelper(IPartitionHelperLogger logger) { _logger = logger; _partitions = new ConcurrentDictionary <Uri, IEnumerable <Int64RangePartitionInformation> >(); }
public async Task <IEnumerable <Int64RangePartitionInformation> > GetInt64Partitions(Uri serviceUri, IPartitionHelperLogger logger) { logger.EnumeratingPartitions(serviceUri); lock (_lock) { if (_int64Partitions.ContainsKey(serviceUri)) { var partitions = _int64Partitions[serviceUri]; logger.EnumeratedExistingPartitions(serviceUri, partitions); return(partitions); } } try { var fabricClient = new FabricClient(); var servicePartitionList = await fabricClient.QueryManager.GetPartitionListAsync(serviceUri); IList <Int64RangePartitionInformation> partitionKeys = new List <Int64RangePartitionInformation>(servicePartitionList.Count); foreach (var partition in servicePartitionList) { var partitionInfo = partition.PartitionInformation as Int64RangePartitionInformation; if (partitionInfo == null) { throw new InvalidOperationException($"The service {serviceUri} should have a uniform Int64 partition. Instead: {partition.PartitionInformation.Kind}"); } partitionKeys.Add(partitionInfo); } lock (_lock) { if (!_int64Partitions.ContainsKey(serviceUri)) { _int64Partitions.Add(serviceUri, partitionKeys.ToArray()); } } logger.EnumeratedAndCachedPartitions(serviceUri, partitionKeys); return(partitionKeys); } catch (Exception ex) { logger.FailedToEnumeratePartitions(serviceUri, ex); throw new PartitionEnumerationException(serviceUri, ex); } }